有没有办法在使用活动记录生成器方法时填充反向关系



我想使用 ActiveRecord 关联生成器方法来构建内存对象。我预计星舰物体的has_many关联将包含机组成员对象。

这是否可能,或者 ActiveRecord 的预期限制?

require 'active_record'
require 'minitest/autorun'
ActiveRecord::Base.establish_connection(
adapter: "sqlite3",
database: ":memory:",
)
ActiveRecord::Schema.define do
create_table(:starships)
create_table(:crew_members) { |t| t.references :starship }
end
class Starship < ActiveRecord::Base
has_many :crew_members, inverse_of: :starship
end
class CrewMember < ActiveRecord::Base
belongs_to :starship, inverse_of: :crew_members
end
class BuilderTests < MiniTest::Test
# fails
def test_build_association_populates_both_sides_of_the_relationship
refute_predicate CrewMember.new.build_starship.crew_members, :empty?
end
# fails
def test_create_association_populates_both_sides_of_the_relationship
refute_predicate CrewMember.create.create_starship.crew_members, :empty?
end
# passes
def test_association_is_not_empty_when_saved_and_reloaded
crew_member = CrewMember.create
starship = crew_member.create_starship
assert crew_member.changed?
assert_predicate starship.crew_members.reload, :empty?
crew_member.save!
refute_predicate starship.crew_members.reload, :empty?
end
end

我的用例有点脆弱,这更多的是我观察到的好奇心,想知道这是否可能,或者只是一厢情愿的行为。

build_association

尚未保存对象,如果要实现该对象,则必须使用create_association,或者手动保存crew_member.starship实例。因此,您看到crew_member.starship的主要原因是因为它在内存中,但由于它尚未持久化,因此两者之间没有联系。有关关联文档的更多信息

相关内容

  • 没有找到相关文章

最新更新