如果与同一模型有两个belongs_to关系,则Rails ActiveRecord会构建错误的外键

Mar*_*rry 6 activerecord ruby-on-rails-3

使用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
Run Code Online (Sandbox Code Playgroud)

应用程序/模型/ 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
Run Code Online (Sandbox Code Playgroud)

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

@message = @user.messages.build(<accessible attributes>)
Run Code Online (Sandbox Code Playgroud)

我发现它填写了可选项from_user不是强制项owner.

有没有办法控制哪个外键.build填写?或者我是否需要.new手动使用和分配所有外键?

@message = Message.new(<accessible attributes>)
@message.owner = @user
@message.from_user = @another_user
Run Code Online (Sandbox Code Playgroud)

Cod*_*lan 5

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

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
Run Code Online (Sandbox Code Playgroud)