:conditions の遅延評価

泥臭い&あんまり使わないので忘れがちだが、Associationを定義する時に、シングルクォートを使うと、参照時のインスタンスで評価し直してくれる。

  class Road
    belongs_to :node, :foreign_key => [:meshcode, :nodeno], :conditions => 'nodes.linkno = #{linkno}'
  end

  Road.find(:first).node # => "SELECT * FROM nodes WHERE nodes.linkno = 1"
  class Road
    belongs_to :node, :foreign_key => [:meshcode, :nodeno], :conditions => 'nodes.linkno = #{table_name}.linkno'
  end

  Road.find(:first, :include => :node) # => "SELECT * FROM roads LEFT OUTER JOIN nodes ON ... WHERE nodes.linkno = roads.linkno"

ここでtable_nameが(やってみたら)使えるのは、

# lib/active_record/associations.rb
  class JoinBase
    attr_reader :active_record, :table_joins
    delegate    :table_name, :column_names, :primary_key, :reflections, :sanitize_sql, :to => :active_record

このdelegateのおかげか?

次のように書けば、どちらでもいける。

  belongs_to :node, :foreign_key => [:meshcode, :nodeno], :conditions => 'nodes.linkno = #{linkno rescue "#{table_name}.linkno"}'

いいのか、こんなんで。

Thu, 05 Jul 2007 15:38 カテゴリ ,

タグ ,

Comment :conditions の遅延評価


RSS