Ruby on Rails:多对多实例

时间:2017-06-08 19:37:00

标签: ruby-on-rails ruby activerecord

铁杆新手。我正在创建一个项目,其中包含几个相互关联的数据库表。我想知道如何在创建实例后添加外键引用。代码如下:

在架构中:

    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

在rails控制台中:

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

3 个答案:

答案 0 :(得分:1)

如果您尝试将其设为user1成为博客的所有者,则可以尝试

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

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

希望我回答你的问题!

答案 1 :(得分:0)

由于博客has many用户,.users将是一个集合(Array或ActiveRecord_Relation)。

尝试:blog1.users << user1

<< (shovel operator) docs

答案 2 :(得分:0)

当您编写blog1.users时,您将返回一个数组,因此执行= something将无效。虽然您可以使用<<添加到数组或说array.push(),但这不是最佳做法。

相反,has_many(或has_one等)允许您使用build_表示法来创建相关对象。所以你可以这样做:blog1.users.build,它将创建一个为博客引用的新用户。或者,如果您想要保留它,可以致电.users.create

有很多方法可以绕过它,但如果可用的话,使用ActiveRecord方法是保持代码可读性和简短的好方法。