我有一个包含
的Message模型belongs_to :from, class_name: "User"
belongs_to :to, class_name: "User"
当我做像
这样的事情时user.messages.build(text: "my message")
如何确保用户输入的"from"协会是建筑物的使用者?Rails如何知道是否将它放入"from"或"to" ?
我假设Message
上的外键是from_id
和to_id
。
如果您重命名了关联,当您在User
模型中定义messages
关联时,您需要指定foreign_key
。
class User < ApplicationRecord
has_many :received_messages, foreign_key: :to_id, class_name: "Message"
has_many :sent_messages, foreign_key: :from_id, class_name: "Message"
end
https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html method-i-has_many
否则,Rails会假设你在Message
上有user_id
,我认为它会引发错误,因为你的messages
表没有user_id
列(未测试)。
我认为建立message
模型的正确方法是这样的:
belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'
您的迁移将像
create_table :messages do |t|
t.integer :sender_id
t.integer :recipient_id
t.timestamps
end
然后,在user
模型中:
has_many :messages, :foreign_key => :sender_id
然后,在message form
中你可以这样设置sender
:
<%= f.hidden_field :sender_id, value: current_user.id %>
<%= f.hidden_field :recipient_id, value: @user.id %>
你也可以像在你的例子中这样设置参数:
Message.create(sender_id: 1, recipient_id: 3)
你可以这样做:
@message.sender.username
@message.recipient.username