: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 カテゴリ ruby, web
タグ associations, rails