2012-05-29 30 views
6

Rails 3.2.3 kullanma, Kullanıcı ve İleti modellerim var. Her mesaj bir kullanıcıya aittir ve her bir mesajın bir user.id de alan isteğe bağlı bir from_user alanı vardır.Raylar ActiveRecord, aynı modele ait iki tane varsa, yanlış yabancı anahtar oluşturur

app/modeller/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 

app/modeller/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 

görüyorum sorun .build yöntemi ile olduğunu. .build'u kullanmanın temel nedeni, (muhtemelen korunan) bir yabancı anahtarı başlatmaktır, doğru mu? (Active kayıt dernekler üzerinde Rails Guide Bkz: "Onların yabancı anahtar aracılığıyla bağlantı oluşturulacaktır.") Öyle olmadığını zorunlu owner opsiyonel from_user doldurup olduğunu fark

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

koşuyorum Ancak zaman .

Hangi yabancı anahtarın .build doldurulduğunu denetlemenin bir yolu var mı? Veya sadece .new'u kullanmam ve tüm yabancı anahtarları manuel olarak atamam gerekiyor mu?

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

cevap

5

ActiveRecord, aynı ada sahip 2 ilişkilendirmenin olmasını sevmez. İlişkilendirme isimlerini değiştirmek zorunda kalacaksın. Bu da class_name uygunluğunu sağlamanız gerektiği anlamına gelir. Belki bir şey:

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

Teşekkürler, üzerine gelin. Ve sonra inşa etmek için @ user.owner_messages.build () 'dir. Merak ediyorum, eğer Rails kendine özgü birleşme isimleri gerektiriyorsa, eşsiz olmadıklarından şikayet etmez mi? Görünüşe göre sadece son tanımı kullanır - eğer ben has_many: message,: foreign_key => "owner_id" i tanımlamak için olsaydım, bunu hiç görmezdim. –

+0

'' inverse_of' isimlerinin 'belongs_to' satırlarında değişmesi gerektiğini fark ettiniz. belongs_to: sahip,: class_name => "Kullanıcı",: inverse_of =>: owner_messages' ve 'belongs_to: from_user,: class_name =>" Kullanıcı ",: inverse_of =>: user_messages'. –

İlgili konular