:conditions の遅延評価

投稿者 nanki 2007-07-05 15:38:00 GMT

泥臭い&あんまり使わないので忘れがちだが、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"}'

いいのか、こんなんで。

This entry was posted on 2007-07-05 15:38:00 GMT and カテゴリ , . You can follow any response to this entry through the Atom feed. or a trackback from your own site.

タグ ,


トラックバック

トラックバックリンク:
http://blog.netswitch.jp/trackbacks?article_id=8587