父模型在一对多关联中返回一个空数组
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!
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
方法以将关联保存在数据库中。
我设置了两个模型,其中一个专辑有一个流派,该流派有很多属于它的专辑。
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!
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
方法以将关联保存在数据库中。