我想使用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我的用例有点脆弱,这更像是我观察到的一种好奇心,我想知道这是否可能,或者仅仅是一厢情愿的行为。
发布于 2020-06-10 20:55:00
build_association尚未保存对象,如果要实现此目的,必须使用create_association,或者手动保存crew_member.starship实例。所以您看到crew_member.starship的主要原因是因为它在内存中,但是由于它还没有持久化,所以两者之间没有联系。关于协会文档的更多信息
https://stackoverflow.com/questions/62305983
复制相似问题