2011-07-03 11 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を保存するつもりはありません。だから、それは仮想属性のようなものです(ただし、関連付けによってDBに残っています)。そして、後でDBにない他の属性を追加する必要があるかもしれません。アソシエーションを使わずにそれを行うことは可能ですか?

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

あなたのdbスキーマを教えてください。 –

+0

私はそれを保存しようとしていません。 sender_nicknameは私のデータベースには必要ない仮想属性のようなものです。私はJSONでレンダリングしたいだけです。 – Max

答えて

0

限り、私は唯一のモデルの属性を取り、シリアライズされます to_jsonを知っているように(chat_message.attributesのように、attr_accessorではありません)。

あなたは適切に送信者、ユーザーモデルなどを取得しています。

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

またで動作することがあります。私はどうなるのか

はbelong_toと、送信者、ユーザーまたは何それはと呼ばれる、との関係を作り、その後、JSONに変換するために、このコードを使用することですあなたのコード、そしてちょうど:

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

関連する問題