我试图实现以下,关系和对象调用轨道4的has_many通过 - 消息发送者接收与
用户可以发送许多消息(user.sent_messages) 一个消息可以具有一个发送器(消息。发送者)
用户可以接收许多消息(user.received_messages) 一个消息可以具有许多接收器(message.receivers)
我的模式是这样的:
create_table "activities", force: true do |t|
t.integer "sender_id"
t.integer "message_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "receiver_id"
end
create_table "messages", force: true do |t|
t.text "body"
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "read", default: false
end
个
我的模型是这样的:
class User < ActiveRecord::Base
has_many :activities, class_name: 'Activity', foreign_key: 'sender_id', dependent: :destroy
has_many :sent_messages, through: :activities
has_many :reverse_activities, class_name: 'Activity', foreign_key: 'receiver_id'
has_many :received_messages, through: :reverse_activities
end
class Activity < ActiveRecord::Base
belongs_to :sent_messages, class_name: 'User'
belongs_to :received_messages, class_name: 'User'
belongs_to :message
end
class Message < ActiveRecord::Base
has_many :activities, foreign_key: 'sender_id'
has_one :sender, through: :activities, foreign_key: 'sender_id', class_name: 'User'
has_many :reverse_activities, foreign_key: 'receiver_id', class_name: 'User'
has_many :receivers, through: :reverse_activities, source: :receiver
end
方法sent_messages & received_messages工作,但是它们指向直接返回给用户表并返回该用户,而不是信息的细节。
我还没有试图让消息模型工作,因为用户模型是不正确的。
谢谢!
由于这两个建议,我已经得到了以下工作
class User < ActiveRecord::Base
has_many :activities, class_name: 'Activity', foreign_key: 'sender_id'
has_many :sent_messages, through: :activities, foreign_key: 'message_id', class_name: 'Message', source: :sender
has_many :reverse_activities, class_name: 'Activity', foreign_key: 'receiver_id'
has_many :received_messages, through: :reverse_activities, foreign_key: 'message_id', class_name: 'Message', source: :receiver
end
class Message < ActiveRecord::Base
has_one :sent_activities, class_name: 'Activity', foreign_key: 'message_id'
has_one :sender, through: :sent_activities, foreign_key: 'sender_id', class_name: 'User'
has_many :receiver_activities, class_name: 'Activity', foreign_key: 'message_id'
has_many :receivers, through: :receiver_activities, foreign_key: 'receiver_id', class_name: 'User'
validates :body, presence: true
end
class Activity < ActiveRecord::Base
belongs_to :sender, class_name: 'User'
belongs_to :receiver, class_name: 'User'
belongs_to :receiver, class_name: 'Message'
belongs_to :sender, class_name: 'Message'
end
根据需要方法的我正在努力的结果。
现在只是为了让创建操作工作!
嗨Rich,感谢你的看法,除此之外,这一切都会使我受限于a)一条消息只能发送给一个人,或者b)不得不复制整个消息内容,并发送给多个人。这是我想用我的活动连接表抽象出来的。 – benlaplanche
哦,我以前只是想要单个收件人/发件人?我可以重构包括一个连接表,如果你想要 –
如果可能,这将是伟大的! – benlaplanche