2015-03-19 76 views
0

我已经设置了两个模型,其中一个专辑具有流派,并且流派拥有属于它的许多专辑。父模型在一对多关联中返回一个空数组

class Album < ActiveRecord::Base 
    attr_accessor :genre_id 
    belongs_to :genre 
end 

class Genre < ActiveRecord::Base 
    has_many :albums 
end 

这里是我的移民文件:

class AddGenreIdToAlbum < ActiveRecord::Migration 
    def change 
    add_column :albums, :genre_id, :integer 
    end 
end 

在我的rails控制台,我可以一个流派分配给我的专辑像这样:

album = Album.last 
album.genre = Genre.last 

的问题是,如果我查询专辑对于那个流派我得到一个空阵列:

genre = Genre.last 
genre.albums 
=> #<ActiveRecord::Associations::CollectionProxy []> 

为了使两个型号相应地保存,我需要做些什么?

+0

当你创建一个专辑时,你将它分配给一个流派?显然你会得到一个空的数组,如果专辑没有被分配到一个流派。只是检查:) – theartofbeing 2015-03-19 03:40:31

+0

另外,你可以确认你有'''t.belongs_to:genre''或'''t.integer:genre_id''在你的迁移吗? – theartofbeing 2015-03-19 03:41:55

+0

是的,我分配给它的类型确实存在于db – 2015-03-19 03:43:52

回答

4

您需要拨打save!方法。

album = Album.last 
album.genre = Genre.last 
album.save! 

association=(associate) :

分配联营对象,提取主键,将其设置为外键。

0

你可以尝试:

album = Album.last 
Genre.last.albums << album 
Genre.last.albums 
0

我在上面看到的问题是,专辑没有得到同类型(Genre.last)相关 尝试:

genre = Genre.last 
genre.albums.build(Album.last)) 
genre.save 

有需求成为db(唱片专辑)中的一个记录,并带有该特定类型的外键,除非我们专门要求它创建关联,否则这种情况不会发生......我是否有意义?

1

你应该从Album模型删除attr_accessor :genre_id为使genre_id一个虚拟属性这意味着它将不在数据库中被持久。它将一直存在,直到它被分配到的实例在内存中。一旦实例消失,分配的值就消失了。我很确定你希望将genre_id保存在数据库中,因为我可以在该问题中看到相同的迁移,并且在这种情况下它是唯一的逻辑。

class Album < ActiveRecord::Base 
    attr_accessor :genre_id ## <<== Remove this 
    belongs_to :genre 
end 

当然!正如其他答案中所建议的那样,在确保您确实调用save方法后,将关联保存在数据库中。

相关问题