为什么我的ActiveRecord范围与`merge`返回一个数组?

时间:2013-06-04 21:04:02

标签: ruby rails-activerecord

我的Contract模型上的范围使用merge并返回一个数组,而不是我想要的ActiveRecord::Relation

是的,我见过它说"It is an ActiveRecord::Relation, but Rails is intentionally lying to you"。但在这种情况下:

  • 范围使用merge
  • 只有当它是链中的最后一个范围
  • 时才有效
  • 它返回的对象表示它是类Array
  • 它返回的对象在其祖先中没有ActiveRecord
  • 在返回值上调用ActiveRecord::Relationscoped方法会引发加注NoMethodError: undefined method 'scoped' for []:Array

范围在Contract上,看起来像

scope :hourly, scoped.merge(Division.find_by_name!('Hourly').contracts)

为什么这会返回一个数组?我可以让它返回ActiveRecord::Relation吗?

1 个答案:

答案 0 :(得分:1)

上面的评论。我给了这个虚拟关系,我希望你有分部和合同。

# app/models/contract.rb

scope :hourly,
  select: 'distinct contracts.*',
  joins: :divisions,
  conditions: {
    "divisions.name" => 'Hourly'
  },
  order: :id

contracts = Contracts.hourly
# => [#<Contract id: 1>, #<Contract id: 2>]

contracts.class
# => #<ActiveRecord::Relation>

contracts.scoped.class
# => #<ActiveRecord::Relation>

contracts.arel
# => #<Arel::SelectManager:0x007fab629f7e90>

contracts.to_a
# => [#<Contract id: 1>, #<Contract id: 2>]

contracts.to_sql
# => SELECT distinct contracts.* FROM `contracts` INNER JOIN `divisions` ON `divisions`.`contract_id` = `contracts`.`id` WHERE `divisions`.`name` = 'Hourly' ORDER BY id

请告诉我这是否是你要找的......