2013-06-04 16 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

相關問題