1

私はRuby on Rails 3.2.2を使用していますが、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

注 I : パフォーマンス上の理由からこのアプローチを使用したいと考えています。これActiveRecord::Relationは、遅延読み込みが行われるためです (私の場合、activeパラメーター値がデータベースにない場合active、データベースはまったくヒットしません)。

注 II : の代わりに をパラメーター値pluckとして渡すと、メソッドを使用するとエラーが発生する可能性があります。associationArrayActiveRecord::Relation

4

1 に答える 1

0

1) 私の意見では、これは適切なトレードオフです。配列を引数として送信する機能は失われますが、ある程度のパフォーマンスは得られます。それほど奇妙ではありません。たとえば、スコープを定義するたびに、まさにそれを行っているため、フィルターは関係に対してのみ機能し、配列に対しては機能しません。

Enumerable#pluck2)メソッドが配列に対して透過的に機能するように、いつでも追加できます。もちろん、これ以上リレーションの機能を使用すると機能しません。

module Enumerable 
  def pluck(method, *args) 
    map { |x| x.send(method, *args) } 
  end 
end
于 2012-06-08T21:08:07.343 に答える