2011-07-03 97 views
1

我想添加一個屬性到模型對象。直接訪問工作,但是當我打印整個對象或將其編碼爲JSON時,該屬性被省略。有人能告訴我我做錯了什麼嗎?屬性不被添加到對象

這裏是我的鐵軌控制檯輸出:

irb(main):010:0> b=ChatMessage.new(:user_id=>4,:room_id=>1,:message=>"Hello World") 
=> #<ChatMessage id: nil, room_id: 1, user_id: 4, message: "Hello World", created_at:  nil, updated_at: nil> 
irb(main):011:0> b.sender_nickname="bbb" 
=> "bbb" 
irb(main):012:0> b.sender_nickname 
=> "bbb" 
irb(main):013:0> b 
=> #<ChatMessage id: nil, room_id: 1, user_id: 4, message: "Hello World", created_at: nil, updated_at: nil> 

這裏是我的模型代碼:

class ChatMessage < ActiveRecord::Base 
    attr_accessor :sender_nickname 

    def self.get_last_message_id 
    last_message=ChatMessage.all.last 
    last_message.nil? ? 0 : last_message.id 
    end 

    def self.get_all_messages_after(room_id,message_id) 
    ChatMessage.where("room_id = ? AND id > ?",room_id,message_id) 
    end 
end 

編輯:

這裏是chat_messages表遷移文件。 我真的不想保存sender_nickname。所以它更像是一個虛擬屬性(但通過關聯仍然在數據庫中)。我可能需要稍後添加不在數據庫中的其他屬性。不使用關聯可以做到嗎?

def self.up 
    create_table :chat_messages do |t| 
    t.integer :room_id 
    t.integer :user_id 
    t.string :message 

    t.timestamps 
    end 
end 
+1

您的ChatMessage模型最初是否具有sender_nickname作爲屬性?否則,它將無法保存'sender_nickname'屬性。 – user482594

+0

向我們展示您的數據庫模式。 –

+0

我不想保存它。 sender_nickname就像我不想在我的數據庫中的虛擬屬性。我只想在我渲染的JSON中使用它。 – Max

回答

0

據我所知to_json將只需要屬性模型和序列化(如chat_message.attributes,不attr_accessor)。

你有一個發送者或用戶模型或類似的東西。

我會怎麼做,就是讓一個關係到發件人,用戶還是什麼的叫,有belong_to,然後用這個代碼把它轉換爲JSON:

chat_message.to_json(:include => { :sender => { :only => :nickname } }) 

它也可能合作你的代碼,然後只需:

chat_message.to_json(:include => { :sender_nickname }) 

還有一些文檔在這裏:http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

希望它能幫助:)

+0

感謝您的回覆。我被告知我不應該使用to_json,而是使用ActiveSupport :: JSON.encode,但是這可能也適用於關聯。爲了這個問題,是否有可能無關聯地完成它?我可能需要稍後添加非數據庫屬性。 – Max

+0

嗨,馬克斯,我不確定。它是否與最後一個代碼示例一起工作? –

+0

嗨Jesper。那工作!謝謝!這就是我所做的:ActiveSupport :: JSON.encode(new_messages,:include => {:user => {:only =>:nickname}})認爲我仍然好奇如果我需要包含不在db中。我想我會先試着看。 – Max