ruby-on-rails - ActiveRecord::Relation.concat 在 Rails 5 中失败

标签 ruby-on-rails ruby activerecord activerecord-relation

愚蠢的问题,但我不确定为什么这在 Rails 4.2 中有效,但在 Rails 5.2 中无效。

FamilyCharacteristic.where(family_id: @user.family_ids)
                    .concat(@user.characteristics)

规范在 5.2 中失败:

Failure/Error:
       FamilyCharacteristic.where(family_id: @user.family_ids)
                           .concat(@user.characteristics)

     NoMethodError:
       undefined method `concat' for #<ActiveRecord::Relation []>
       Did you mean?  count

concat 是在 5.2 中从 ActiveRecord::Relation 中删除的,还是 FamilyCharacteristic.where(family_id: @user.family_ids) 在 <4.2 中是一个不同的对象?

感谢您的帮助。

最佳答案

我做了一些挖掘,发现:

  • FamilyCharacteristic.where(family_id: @user.family_ids) 的类没变,还是ActiveRecord::Relation
  • Relation 没有并且仍然没有定义它自己的 concat 方法,但它被委托(delegate)给 Array#concat 直到 this commit happened ,所以在 Rails 4.2 SomeModel.where(id: ids).concat(some_records)(它返回一个 Array)实际上和 SomeModel.where(id : ids).to_a.concat(some_models)
  • ActiveRecord::Delegation 中的 mentioned before change 之后,在 Rails 5.2 中,唯一委托(delegate)给 Array 的方法是此模块中指定的方法和 concat 不在其中

总而言之 - 您示例中的 concat 从来都不是 ActiveRecord 的一部分,而是委托(delegate)给了 Array#concat,这就是它起作用的原因。它不再在 Rails 5 中委托(delegate),因此它会抛出 NoMethodError

关于ruby-on-rails - ActiveRecord::Relation.concat 在 Rails 5 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53125581/

相关文章:

ruby-on-rails - Rspec 测试在命名空间中失败

ruby-on-rails - 如何根据模型属性在索引 View 上设置复选框?

ruby - 理解 ruby 有理数中的数字

ruby-on-rails - 工厂女孩/Rails : Generator to create a factory for existing model?

ruby-on-rails - 我可以总结一下 Ruby 模块的作用吗?

ruby - 按组大小排列的 Active Record 顺序

ruby-on-rails - 如何将特定的 gem 版本设置为默认版本?

ruby-on-rails - Rails Webpacker - 如何从 View [HTML 文件] 访问 webpack 条目文件中定义的对象

ruby-on-rails - 在 Rails 3 中设置 session 超时

ruby-on-rails - 迭代 Rails 对象数组以创建键/值对