2011-07-03 5 views
1

특성을 모델 개체에 추가하려고합니다. 직접 액세스가 작동하지만 전체 객체를 인쇄하거나 JSON으로 인코딩 할 때 해당 속성은 제외됩니다. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까?개체에 특성이 추가되지 않음

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 테이블에 대한 마이그레이션 파일

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> 

여기 내 모델 코드 :

여기 내 레일 콘솔 출력됩니다. 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되지 않음).

당신은 properbly 보낸 사람, 또는 사용자 모델, 또는 뭐 그런있어.

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

안녕하세요 제스퍼. 그 일! 감사! 이것은 내가 한 일입니다. ActiveSupport :: JSON.encode (new_messages, : include => {: user => {: only => : nickname}}) DB에 없습니다. 나는 그것을 먼저 볼 것입니다. – Max

관련 문제