6

使用 Rails 3.2.3,我有用户和消息模型。每条消息都归一个用户所有,每条消息都有一个可选的 from_user 字段,该字段也采用 user.id。

应用程序/模型/user.rb

class User < ActiveRecord::Base
  has_many :messages, :foreign_key => "owner_id",     :inverse_of => :owner
  has_many :messages, :foreign_key => "from_user_id", :inverse_of => :from_user
end

应用程序/模型/message.rb

class Message < ActiveRecord::Base
  belongs_to :owner, :class_name => "User", :inverse_of => :messages
  validates  :owner, :presence => true   # Every message must have an owner_id

  belongs_to :from_user, :class_name => "User", :inverse_of => :messages
end

我看到的问题是.build方法。使用的主要原因.build是实例化一个(可能受保护的)外键,对吧?(请参阅有关 Active Record 关联的Rails 指南:“将创建通过其外键的链接。”)但是当我运行时

@message = @user.messages.build(<accessible attributes>)

我发现它是在填写 optionalfrom_user不是强制的owner

有什么方法可以控制.build填写哪个外键?还是我只需要.new手动使用和分配所有外键?

@message = Message.new(<accessible attributes>)
@message.owner = @user
@message.from_user = @another_user
4

1 回答 1

5

ActiveRecord 不喜欢你有 2 个同名的关联。您将不得不更改关联名称。这意味着您还必须提供class_name属性。也许是这样的:

has_many :owner_messages, :class_name => 'Message', :foreign_key => "owner_id",     :inverse_of => :owner
has_many :user_messages, :class_name => 'Message', :foreign_key => "from_user_id", :inverse_of => :from_user
于 2012-05-29T19:45:25.180 回答