2017-06-08 90 views
0

新的rails。我創建了一個包含多個數據庫表的項目,它們之間相互關聯。我想知道如何在創建實例後添加外鍵引用。下面的代碼:Ruby on Rails:多對多實例

在架構:

class Blog < ActiveRecord::Base 
     has_many :posts 
     has_many :owners 
     has_many :users, through: :owners 
    end 

    class Owner < ActiveRecord::Base 
     belongs_to :user 
     belongs_to :blog 
    end 

    class User < ActiveRecord::Base 
     has_many :messages 
     has_many :posts 
     has_many :owners 
     has_many :blogs, through: :owners 
    end 

型號:

class User < ActiveRecord::Base 
    has_many :messages 
    has_many :posts 
    has_many :owners 
    has_many :blogs, through: :owners 
end 

class Owner < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :blog 
end 

class Blog < ActiveRecord::Base 
    has_many :posts 
    has_many :owners 
    has_many :users, through: :owners 
end 

在軌控制檯:

blog1 = Blog.first 
user1 = User.first 
blog1.users = user1 
NoMethodError: undefined method `each' for #<User:0x0000000487e9f8> 

回答

0

由於博客has many用戶,.users將是一個集合(數組或ActiveRecord_Relation)。

嘗試:blog1.users << user1

<< (shovel operator) docs

1

如果你試圖讓這個USER1成爲博客的主人,你可以嘗試

blog1 = Blog.first 
user1 = User.first 
Owner.create(user: user1, blog: blog1) 

Owner.create(user: User.first, blog:Blog.first) 

希望我回答你的問題!

0

當你正在寫blog1.users,你回來一個數組,所以做= something將無法​​正常工作。雖然您可以使用<<array.push()添加到陣列,但這不是最佳做法。

相反,has_many(或has_one等)允許您使用build_表示法來創建相關對象。所以你可以這樣做:blog1.users.build,它會創建一個博客引用的新用戶。或者如果你想堅持下去,你可以撥打.users.create

有很多方法可以解決它,但如果可用的話使用ActiveRecord方法是保持代碼可讀性和簡短性的好方法。