0

次のような動的条件で 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
  1. ラムダブロックの必須パラメータは何ですか?
  2. なぜそこにある必要があるのですか?
  3. そのパラメータが常にゼロのままなのはなぜですか?
4

1 に答える 1