父模型在一对多关联中返回空数组

时间:2015-03-19 03:18:40

标签: ruby-on-rails ruby activerecord associations

我已经设置了两个模型,其中一个专辑有一个类型,并且该类型有很多属于它的专辑。

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 []>

为了让两个模型相应保存,我需要做什么?

4 个答案:

答案 0 :(得分:4)

您需要调用save!方法。

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

association=(associate) :

  

指定关联对象,提取主键,并将其设置为外键。

答案 1 :(得分:1)

您应该从attr_accessor :genre_id模型中删除Album,因为它会使genre_id成为虚拟属性,这意味着不会被保留在数据库中。它只有在分配给它的实例存储在内存中才可用。实例消失后,分配的值就消失了。而且我很确定你希望将genre_id保存在数据库中,因为我可以在问题中看到相同的迁移,在这种情况下它是唯一合乎逻辑的。

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

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

答案 2 :(得分:0)

你可以尝试:

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

答案 3 :(得分:0)

我上面看到的问题是专辑没有与流派相关联(Genre.last) 尝试:

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

在db(专辑记录)中需要有一个记录,其中包含该特定类型的外键,除非我们特别要求它创建该关联,否则这种情况不会发生......我是否有意义?