次のような動的条件で has_many 関連付けを定義します。
class Checkin < ActiveRecord::Base
has_many :evaluations, :conditions => proc {"evaluations.placement_id = #{self.placement_id}"}
end
id=1 でのチェックインに placement_id=2 があると仮定します。
> Checkin.find(1).evaluations.to_sql
=> "SELECT \"evaluations\".* FROM \"evaluations\" WHERE \"evaluations\".\"checkin_id\" = 1 AND (evaluations.placement_id = 2)"
私はプロシージャよりもラムダを好むので、関連条件をラムダに置き換えようとしていますが、この試みはエラーになります:
:conditions => lambda {"evaluations.placement_id = #{self.placement_id}"}
> Checkin.find(1).evaluations.to_sql
ArgumentError: wrong number of arguments (1 for 0)
このエラーは、ラムダ ブロックに引数を指定することで簡単に修正できます。
:conditions => lambda {|a| "evaluations.placement_id = #{self.placement_id}"}
> Checkin.find(1).evaluations.to_sql # a is nil inside of this lambda call!
=> "SELECT \"evaluations\".* FROM \"evaluations\" WHERE \"evaluations\".\"checkin_id\" = 1 AND (evaluations.placement_id = 2)"
引数を渡しても違いはなく、ラムダのパラメーターは常に nil です。
:conditions => lambda {|a| puts "a: #{a || 'undefined'}"; "evaluations.placement_id = #{self.placement_id}"}
Checkin.find(1).evaluations(5) # => has no effect on produced sql
a: undefined
# and here are returned evaluations
- ラムダブロックの必須パラメータは何ですか?
- なぜそこにある必要があるのですか?
- そのパラメータが常にゼロのままなのはなぜですか?