首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用ActiveRecord构建器方法时,是否有方法填充逆关系?

在使用ActiveRecord构建器方法时,是否有方法填充逆关系?
EN

Stack Overflow用户
提问于 2020-06-10 14:24:23
回答 1查看 37关注 0票数 0

我想使用ActiveRecord关联生成器方法在内存对象中构建一个。我期望星舰对象的has_many关联包含船员对象。

这是可能的,还是ActiveRecord的预期限制?

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

发布于 2020-06-10 20:55:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62305983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档