通过重命名关联使用 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