2012-05-29 41 views
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 

回答

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 
+1

謝謝,現貨。然後它是'@ user.owner_messages.build()'來構建。我想知道爲什麼,如果Rails需要唯一的關聯名稱,那麼當它們不是唯一的時候它不會抱怨?顯然它只是使用最後一個定義 - 如果我碰巧定義了'has_many:messages,:foreign_key =>「owner_id」'second,我永遠不會看到這個。 –

+0

剛剛意識到':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'。 –

相關問題