我用这样的动态条件定义了一个 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)"
因为我更喜欢 lambdas 而不是 procs,所以我试图用 lambda 替换关联条件,但是这种尝试会导致错误:
:conditions => lambda {"evaluations.placement_id = #{self.placement_id}"}
> Checkin.find(1).evaluations.to_sql
ArgumentError: wrong number of arguments (1 for 0)
通过向 lambda 块提供参数可以轻松修复该错误:
: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)"
传递参数没有任何区别,并且 lambda 的参数始终为零:
: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
- lambda 块的必需参数是什么?
- 为什么它应该在那里?
- 为什么那个参数总是保持为零?