2012-06-08 30 views
1

我正在使用Ruby on Rails 3.2.2,並且想知道是否將正確/不危險/常見方法作爲方法參數傳遞給ActiveRecord::Relation對象。將「ActiveRecord :: Relation」對象作爲方法參數傳遞是否是正確/不危險/常見的方法?

這時我打算這樣使用這種方法在我的模型的範圍方法:

class Article < ActiveRecord::Base 
    def self.with_active_associations(associations, active = nil) 
    # associations.class 
    # => ActiveRecord::Relation 

    case active 
    when nil 
     scoped 
    when 'active' 
     with_ids(associations.pluck(:associated_id)) 
    when 'not_active' 
     ... 
    else 
     ... 
    end 
    end 
end 

注我:我想用這種方法因爲性能原因,因爲ActiveRecord::Relation是延遲加載(在我的情況下,如果active參數值不是active數據庫根本沒有命中)。

注II:如果我通過作爲association參數值的Array代替ActiveRecord::Relationpluck方法的使用可能會產生錯誤。

回答

0

1)在我看來,這是一個很好的權衡,你失去了發送數組作爲參數的能力,但你獲得了一些性能。這並不奇怪,例如,每當你定義一個範圍時,你正在做的就是這樣一個過濾器,它只能處理關係而不是數組。

2)您可以隨時添加Enumerable#pluck,這樣該方法就可以透明地處理數組。當然,如果你使用更多的關係特徵,它將不起作用。

module Enumerable 
    def pluck(method, *args) 
    map { |x| x.send(method, *args) } 
    end 
end 
+0

我無法找到使用和/或解釋傳遞'ActiveRecord :: Relation'作爲方法參數的方法的示例或博客文章。你可以鏈接那些人(如果你知道和/或可以找到一個)? – Backo

+0

我不知道博客評論這件事,但對我來說這似乎不是什麼大事...... – tokland

相關問題