4

我试图实现以下,关系和对象调用轨道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 

根据需要方法的我正在努力的结果。

现在只是为了让创建操作工作!

回答

0

有一些失误模式消息:

class Message < ActiveRecord::Base 

不应该foreign_key是: “MESSAGE_ID”?在foreign_key

has_many :activities, foreign_key: 'sender_id' 

同样的问题:“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 

你看起来像使用消息的ID加入到其他表的发件人ID和接收ID。

class Activity < ActiveRecord::Base 

类名是“用户”,所以sent_messages,received_messages返回用户信息

belongs_to :sent_messages, class_name: 'User' 
belongs_to :received_messages, class_name: 'User' 
belongs_to :message 
end 

希望它能帮助。

4

太复杂

你为什么不试试这个:

#app/models/message.rb 
Class Message < ActiveRecord::Base 
    belongs_to :sender, class_name: "User", primary_key: "sender_id" 
    belongs_to :recipient, class_name: "User", primary_key: "recipient_id" 
end 

#app/models/user.rb 
Class User < ActiveRecord::Base 
    has_many :sent_messages, class_name: "Message", foreign_key: "sender_id" 
    has_many :received_messages, class_name: "Message", foreign_key: "recipient_id" 
end 

users 
id | name | email | created_at | updated_at 

messages 
id | sender_id | recipient_id | title | body | created_at | updated_at 

这将允许您加载这样的数据:

@message.sender 
@message.recipient 

@user.sent_messages 
@user.received_messages 

要保存的数据,你可以使用:

#app/controllers/messages_controller.rb 
def new 
    @message = Message.new 
end 

def create 
    @message = Message.new(message_params) 
end 

private 

def message_params 
    params.require(:message).permit(:recipient_id, :title, :body).merge(sender_id: current_user.id) 
end 

#app/views/messages/new.html.erb (user has to be logged in) 
<%= form_for @message do |f| %> 
    <%= f.collection_select(:recipient_id, User.all, :id, :name) %> 
    <%= f.text_field :title %> 
    <%= f.text_area :body %> 
    <%= f.submit %> 
<% end %> 
+0

嗨Rich,感谢你的看法,除此之外,这一切都会使我受限于a)一条消息只能发送给一个人,或者b)不得不复制整个消息内容,并发送给多个人。这是我想用我的活动连接表抽象出来的。 – benlaplanche

+0

哦,我以前只是想要单个收件人/发件人?我可以重构包括一个连接表,如果你想要 –

+0

如果可能,这将是伟大的! – benlaplanche