通过重命名的关联使用 Rails 的 build() 方法



我有一个包含

的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_idto_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

最新更新