通过重命名关联使用 Rails' build() 方法
Using Rails' build() method through a renamed association
我有一个消息模型包含
belongs_to :from, class_name: "User"
belongs_to :to, class_name: "User"
当我做类似
的事情时
user.messages.build(text: "my message")
如何确保放入“来自”关联的用户是建筑用户? 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
table 没有 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
我有一个消息模型包含
belongs_to :from, class_name: "User"
belongs_to :to, class_name: "User"
当我做类似
的事情时user.messages.build(text: "my message")
如何确保放入“来自”关联的用户是建筑用户? 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
table 没有 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