1

私は Rails 3 でメッセージング システムを開発しています。私のデータベース構造はおおよそ次のとおりです。

users:  
  id  
  name  

messages:  
  id  
  body

users_messages:  
  user_id  
  message_id  
  direction  
  is_read  
  created_at  

リレーションシップ モデルを使用できるようにするには、*has_many :through* アソシエーションを使用する必要があると思います。

class User < ActiveRecord::Base
  has_many :user_messages
  has_many :messages, :through => :user_messages
end

class UserMessages < ActiveRecord::Base
  belongs_to :users
  belongs_to :messages
end

class Messages < ActiveRecord::Base
  has_many :user_messages
  has_many :users, :through => :user_messages
end

呼び出してすべてのユーザーのメッセージを取得しuser.messages、方向によって着信/発信を検出できます。次のことができる関係をどのように作成するかがよくわかりません。

  message.sender  
  message.recipient
  user.messages.first.recipient ...

同様に、各メッセージには、user_messages テーブルに少なくとも 2 つの行が必要です。

  user_id_sender , message_id, outgoing ....
  user_id_recipient, message_id, incoming ....  

私のデータベース構造が間違っているのでしょうか?誰かがより効果的なデザインを提案できますか?

前もって感謝します。

4

1 に答える 1

0

データベーススキーマ:

messages:
  id
  sender_id
  recipient_id
  body  

アプリ/モデル/メッセージ.rb:

class Messages < ActiveRecord::Base
  has_many :users, :through => :user_messages
  belongs_to :sender, :class_name => 'User', :foreign_key => 'sender_id'
  belongs_to :recipient, :class_name => 'User', :foreign_key => 'recipient_id'
end

そうすることで、次のことができます。

message.sender  
message.recipient
user.messages.first.recipient
于 2013-01-13T01:45:40.797 に答える