【问题标题】:Mongoid find not working?Mongoid 发现不工作?
【发布时间】:2013-04-26 15:18:59
【问题描述】:

我有组和用户模型。用户属于组,组有很多用户。

我正在使用 Rspec 编写集成测试:当一个组至少有一个用户时,该组不会被删除。

工厂:

FactoryGirl.define do
  factory :group_with_users do
    name 'Demo group'

    ignore do
      users_count 2
    end

    after(:create) do |group, evaluator|
      FactoryGirl.create_list(:user, evaluator.users_count, group: group)
    end
  end
end

规格:

require 'spec_helper'

feature 'admin can manage groups' do
  background do
    @group_spec = FactoryGirl.create(:group_with_users)

    visit groups_path
  end

  scenario "don't delete group because it's not empty (there are users)" do
    page.should have_text(@group_spec.name)

    # DEBUGGING
    binding.pry

    click_link 'Delete'

    page.should have_text('Not deleted')
    page.should have_text(@group_spec.name)
  end
end

组控制器:

def destroy
  @group = Group.find(params[:id])

  # DEBUGGING
  binding.pry

  msg = if @group.users.size > 1
          'Not deleted'
        else
          @group.delete
          'Deleted'
        end

  redirect_to groups_path, notice: msg
end

问题是组正在被删除。所以我决定调试(参见规范和控制器中的#DEBUGGING)代码。

在规范中:

@group_spec.users.size
>> 2

在控制器中:

@group.users.size
>> 0

比较两个对象:

@group === @group_spec
>> true

编辑: 在规范调试中:

Group.find(@group_spec._id).users.size
>> 0

PS:“数据模型”有点复杂。但这就是想法。

【问题讨论】:

  • 哦!为什么? ...我正在使用 Mongoid::Paranoia 模块,所以我正在软删除文档。
  • delete 不会触发回调。顺便说一句,我猜:@group_spec.valid? => false
  • 见鬼,至少我贡献了一点:)
  • @group_spec.users.map(&:valid?)怎么样
  • @group_spec.users.map(&:valid?) => [true] ... users_count = 1

标签: ruby-on-rails ruby mongoid factory-bot


【解决方案1】:

我认为您在工厂中犯了一个错误,实际上并没有将任何用户放入您的组中。它应该是这样的:

FactoryGirl.define do
  factory :group_with_users do
    name 'Demo group'

    ignore do
      users_count 2
    end

    after(:create) do |group|
      group.users << FactoryGirl.create_list(:user, users_count, group: group)
    end
  end
end

您的调试会话也具有误导性,因为 @group@group_spec 实际上是不同的实例,这就是它们具有不同数据的原因。您可以通过检查object_id 或致电equal? 来验证这一点。 === 是用于 case 语句的等式。 (有关不同比较运算符的说明,请参阅 here。)如果两条记录具有相同的 id,则 ActiveRecord 认为它们相同(在 ===== 意义上)。

【讨论】:

  • 谢谢@davogones,但我得到了相同的...我没有在问题中添加它,但我必须确保用户属于同一组的帐户:after(:create) { |group, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, group: group, account: group.account) } ...
  • 我认为你的组模型应该自动处理反向关系——我就是这样做的。尽管如此,我还是修复了代码以匹配您想要的方式。
  • 谢谢,它有效。你能告诉我,为什么@group === @group_spec &gt;&gt; true,而@group_spec.users.size &gt;&gt; 2 and @group.users.size &gt;&gt; 0 是以前的工厂?
  • @group@group_spec 是不同的实例。我在答案中添加了解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2012-07-21
  • 2013-11-01
  • 1970-01-01
  • 2021-04-07
  • 2017-03-04
相关资源
最近更新 更多