6
使用Rails的3.2.3,我有用戶和消息模型。每條消息都由用戶擁有,並且每條消息都有一個可選的from_user字段,該字段也採用user.id.Rails的ActiveRecord建立錯誤的外鍵,如果有兩個belongs_to關係到相同的模型
應用程序/模型/ 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
的主要原因是實例化一個(可能受保護的)外鍵,對吧? (見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
謝謝,現貨。然後它是'@ user.owner_messages.build()'來構建。我想知道爲什麼,如果Rails需要唯一的關聯名稱,那麼當它們不是唯一的時候它不會抱怨?顯然它只是使用最後一個定義 - 如果我碰巧定義了'has_many:messages,:foreign_key =>「owner_id」'second,我永遠不會看到這個。 –
剛剛意識到':inverse_of'名稱必須在'belongs_to'行中改變。 'belongs_to:owner,:class_name =>「User」,:inverse_of =>:owner_messages'和'belongs_to:from_user,:class_name =>「User」,:inverse_of =>:user_messages'。 –