我有一个LabCollection:
class LabCollection < ApplicationRecord
# Relationships
belongs_to :lab_container, polymorphic: true, optional: true
has_many :lab_collection_labs
has_many :labs, -> { published }, through: :lab_collection_labs
has_many :lab_collection_inclusions, dependent: :destroy
end它有许多LabCollectionLabs:
class LabCollectionLab < ApplicationRecord
acts_as_list scope: :lab_collection_id, add_new_at: :bottom
belongs_to :lab_collection
belongs_to :lab
end它有实验室的身份证,属于实验室。
我有一个规范,它测试如何创建新的关联,并在以下几个方面进行了验证:
context 'when the lab container has labs already present' do
it 'removes the present labs and adds the new ones' do
subject = RawLabAdder
expect(populated_lab_collection.labs).to eq labs
subject.new(populated_lab_collection, [lab4.id, lab5.id]).perform
expect(populated_lab_collection.labs).not_to eq labs
binding.pry
expect(populated_lab_collection.labs).to eq [lab4, lab5]
end
end如果您需要查看代码的内部工作情况,请让我知道,但是问题似乎与RSpec和刷新关联有关。当我到达binding.pry点并调用populated_lab_collection.lab_collection_labs时
populated_lab_collection.lab_collection_labs
=>
[lab_collection_lab_4, lab_collection_lab_5]但是,当我调用.labs时:
populated_lab_collection.labs
=>
[]通过检查lab_collection_labs,我可以看到它们每个都有一个lab_id,并且存在一个用于这些ID的实验室。我相信我的问题是,我没有正确地刷新记录,但是我尝试过:
# populated_lab_collection.reload
# populated_lab_collection.lab_collection_labs.reload
# populated_lab_collection.lab_collection_labs.each do |x|
# x.lab.reload
# end
# populated_lab_collection.labs.reload任何关于如何让RSpec正确读取记录嵌套关联的建议都是非常感谢的。正如我在检查记录时所说的,它有两个lab_inclusion_labs,每个lab_inclusion_labs都有一个实验室,但是父记录显然没有实验室。
编辑: RawLabAdder类:
module LabCollections
class RawLabAdder
def initialize(incoming_lab_collection, lab_ids = [])
@lab_ids = lab_ids
@lab_collection = incoming_lab_collection
end
def perform
remove_associated_labs
add_labs
end
private
def add_labs
@lab_ids.each do |x|
lab = Lab.find(x)
LabCollectionInclusionAdder.new(@lab_collection, lab).perform
end
end
def remove_associated_labs
@lab_collection.lab_collection_inclusions.map(&:destroy)
@lab_collection.lab_collection_labs.map(&:destroy)
end
end
end发布于 2018-11-14 14:56:33
如果在预挂钩或规范中创建一个实例,然后对其执行一些与数据库相关的工作,那么您拥有的实例将不再引用最新的信息。
在断言之前尝试重新加载populated_lab_collection。
expect(populated_lab_collection.reload.labs).not_to eq labshttps://stackoverflow.com/questions/53302806
复制相似问题