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

Parent model returning an empty array in a one to many association

我设置了两个模型,其中一个专辑有一个流派,该流派有很多属于它的专辑。

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

我需要做什么才能使两个模型相应地保存?

您需要调用save!方法。

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

association=(associate) :

Assigns the associate object, extracts the primary key, and sets it as the foreign key.

你能试试吗:

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

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

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

db(专辑记录)中需要有一条记录,其中包含该特定流派的外键,除非我们特别要求它创建关联,否则不会发生这种情况……我说得对吗?

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

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

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