2013-06-04 18 views
4

我的Contract模型使用merge并且返回一个数组,而不是我想要的ActiveRecord::Relation为什么我的ActiveRecord作用域使用`merge`返回一个数组?

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

  • 范围使用merge
  • 它只有当它的链
  • 最后一个范围,它返回的对象说,这是类作品Array
  • 它返回的对象无关约ActiveRecord其祖先
  • 调用ActiveRecord::Relation方法如scoped上的返回值提高了NoMethodError: undefined method 'scoped' for []:Array

范围是Contract看起来类似

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

这是为什么返回一个数组?我可以得到它返回ActiveRecord::Relation

+0

这是我的经验,在一个范围内合并总是返回了。与调用'scoped.to_a'一样。你能否用另一个范围调用'scoped.hourly.contracts'来创建一个新的范围作为'lambda'? – CharlesJHardy

+0

如果你做'scope:hourly, - > {merge(Division.find_by_name!('Hourly')。contracts)}',会发生什么?那样有用吗? –

+0

@AndrewMarshall - 不,我仍然拿回一个数组。 –

回答

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 

让我知道,如果这是你要找的人...

+0

This Works!它产生的查询与我用'.joins(“INNER JOIN ...”)'回退的查询相同。不过,我似乎无法找到关于如何定义范围的文档。你可以指向任何? –

+0

很好听:)说实话我主要只是看了rails的源码。 [这里](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/query_methods.rb)是最有用的部分,但看着所有的Arel关系的东西,看着一些亚伦Patterson谈判有所帮助。 – CharlesJHardy

相关问题