铁杆新手。我正在创建一个项目,其中包含几个相互关联的数据库表。我想知道如何在创建实例后添加外键引用。代码如下:
在架构中:
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>
答案 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
答案 2 :(得分:0)
当您编写blog1.users
时,您将返回一个数组,因此执行= something
将无效。虽然您可以使用<<
添加到数组或说array.push()
,但这不是最佳做法。
相反,has_many(或has_one等)允许您使用build_
表示法来创建相关对象。所以你可以这样做:blog1.users.build
,它将创建一个为博客引用的新用户。或者,如果您想要保留它,可以致电.users.create
有很多方法可以绕过它,但如果可用的话,使用ActiveRecord
方法是保持代码可读性和简短的好方法。