在两个已实例化的对象之间创建关联

9
我有两个模型:(Albums和Product)
1)模型内部
在album.rb里面:
class Album < ActiveRecord::Base
  attr_accessible :name
  has_many :products
end

在 product.rb 内部:
class Product < ActiveRecord::Base
  attr_accessible :img, :name, :price, :quantity
  belongs_to :album
end

“使用“rails console”,我该如何设置关联(以便我可以使用“<%= Product.first.album.name %>”)?例如:”
a = Album.create( :name => "My Album" )
p = Product.create( :name => "Shampoo X" )
# what's next? how can i set the album and the product together?
2个回答

12

你可以这样做:

a = Album.create( name: "My Album" )

p = Product.create( name: "Shampoo X" )
# OR
p = Product.create( name: "Shampoo X", album_id: a.id )
# OR
p.album = a
# OR
p.album_id = a.id
# OR 
a.products << a
# finish with a save of the object:
p.save

你可能需要在产品模型上设置属性accessible为album_id(不太确定)。

同时查看@bdares的评论。


1
如果将_id添加到可访问列表中,那么您可以在实例化时直接插入ID值:Product.create(name:'Shampoo',album_id:a.id) - user684934
@bdares 要添加 _id,我只需要使用 attr_accessible :img, :name, :price, :quantity, :_id,对吗?但是,它给了我这个错误:ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: album_id - rosary dextrose
@MrYoshiji,对于p.album = a,它暂时可以工作,但如果我重新打开控制台,p.album会变成“nil”。对于p.album_id = a.id,它会给出这个错误:NoMethodError: undefined method 'album_id='。对于a.products << p,它会给出这个错误:RuntimeError: can't modify frozen Hash。我需要重新生成这两个模型吗?谢谢大家! - rosary dextrose
你必须授权访问album_id属性:attr_accessible :img, :name, :price, :quantity, :album_id - MrYoshiji
谢谢!显然,我必须重新创建产品模型以拥有“album_id:integer”,而不仅仅是在“attr_accessible”中添加它。 - rosary dextrose
是的,您需要生成一个迁移(http://api.rubyonrails.org/classes/ActiveRecord/Migration.html),以便在数据库中添加新列 album_id 作为整数。 - MrYoshiji

2

创建产品时添加关联:

a = Album.create( :name => "My Album" )
p = Product.create( :name => "Shampoo X", :album => a )

它暂时可以工作。但是,如果我重新打开控制台,p.album会变成“nil”。 - rosary dextrose
你是否在获取第一次创建的相同“Product”?尝试上面的代码,然后重新打开控制台并尝试“Product.find_by_name('Shampoo X').album”。 - Ross Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接