0

私はプライベート メッセージ システムを作成しており、メッセージがどこにあるかを知るためにステート マシンを使用しています。

これは私のモデルです:

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の初心者です

どうもありがとうございました

4

1 に答える 1

0

ここで 2 つのこと (読み取りステータスと配信状態) を追跡しようとしていて、現在それらを組み合わせているようです。これらを別々にしておくことは実際には理にかなっており、はるかにきれいになると思います。

次のことをお勧めします。

  1. ステート マシンで、メッセージの状態を追跡します: 下書き、送信トレイ、送信済み、受信トレイ、ゴミ箱など。

  2. read_at受信者がメッセージを表示した日時を格納するモデル内のフィールドを別に保持し、この値をデフォルトで nil に設定します。

    field :read_at, type: DateTime, default: nil

  3. 読み取りステータスを確認するためのブール メソッドをドキュメントに追加します。

    def read?
    !@read_at.nil?
    end

于 2012-10-03T17:06:21.473 に答える