4

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

是的,我看到它说“它是一个 ActiveRecord::Relation,但 Rails 故意对你撒谎”。但在这种情况下:

  • 范围使用merge
  • 仅当它是链中的最后一个范围时才有效
  • 它返回的对象说它是类的Array
  • 它返回的对象与ActiveRecord它返回的对象与它的祖先
  • 在返回值上调用ActiveRecord::Relation诸如scopedraises 之类的方法NoMethodError: undefined method 'scoped' for []:Array

范围已打开Contract,看起来像

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

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

4

1 回答 1

2

参考上面的评论。我尝试了一种虚拟关系,我希望你与部门和合同有这种关系。

# 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

让我知道这是否是您要找的...

于 2013-06-07T19:45:24.607 回答