0

개인 메시지 시스템을 만들고 있는데 메시지가 어디에 있는지 알기 위해 상태 시스템을 사용하고 있습니다.state_machine inbox 및 보낸 메시지

class Message 
    include Mongoid::Document 
    include Mongoid::Timestamps::Created 

    #fields 
    field :subject, :type => String 
    field :body, :type => String 
    field :place, :type => String 
    field :has_been_read, :type => String 

    # Relationships 
    belongs_to :sender, :class_name => 'User', :inverse_of => :messages_sent 
    belongs_to :receiver, :class_name => 'User', :inverse_of => :messages_received 

    #state machine has been read message? 
    state_machine :has_been_read, :initial => :unread do 
    event :read_message do 
    transition :from => :unread, :to => :read 
    end 
    event :mark_unread do 
    transition :from => :read, :to => :unread 
    end 
    end 
    #state machine status can be in_box, sent, draft, trash, spam 
end 

사용자 모델 :

이 내 모델입니다

class User 
include Mongoid::Document 
include Mongoid::Timestamps::Created 
. 
. 
. 
    has_many :messages_sent, :class_name => 'Message', :inverse_of => :sender 
    has_many :messages_received, :class_name => 'Message', :inverse_of => :receiver 
. 
. 
. 
end 

1º 어떻게 할 수있는 메시지가 sent 또는 inbox 장소에서 동시에입니까?

2º 발신자와 수신자 사용자에게 어떤 초기 상태 메시지가 있습니까?

죄송

하지만 state_machine gem

와 초보자가 당신에게 그것은 당신이 (상태 및 배송 상태를 읽기) 여기에 두 가지를 추적하려는 당신이 현재 결합하는 것처럼 보이는

답변

0

주셔서 감사 해요 함께. 나는 이것이 실제로 의미가 있으며, 이것을 분리하여 유지하는 것이 훨씬 더 깨끗하다고 ​​생각합니다.

나는 다음과 같은 추천 : 당신의 상태 머신에서

  1. 메시지 상태를 추적 유지 : 초안, 보낼 편지함, 보낸,받은 편지함, 휴지통 등

  2. 별도로 유지 read_at받는 사람이 메시지를 보았고이 값을 nil로 기본 설정 한 datetime을 저장하는 필드.

    field :read_at, type: DateTime, default: nil

  3. 읽기 상태를 확인하기 위해 문서에 부울 방법을 추가

    def read?
    [email protected]_at.nil?
    end

+0

대단히 감사합니다! – hyperrjas

+0

내 기쁨. 다행히 도왔다. –