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

时间:2012-05-29 19:39:55

标签: ruby-on-rails-3 activerecord

使用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 Guide:“将创建通过其外键的链接。”)但是当我运行时

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

我发现它填写了可选的from_user而不是强制性owner

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

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

1 个答案:

答案 0 :(得分: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