【发布时间】:2016-11-02 17:20:33
【问题描述】:
我遇到以下问题。我想在模型中设置一定数量的 has_many 关系,其名称取自传递的数组(或者在这种情况下,是哈希的键)。像这样:
object_class_names = {:foo => FooClass, :bar => BarClass}
for key_name in object_class_names.keys
has_many "#{key_name}_objects".to_sym,
-> {where(var: key_name)},
:class_name => object_class_names[key_name]
end
这会导致两个 has_many 关系:some_object.foo_objects 和 some_object.bar_objects。两者都有一个特定的 class_name 和一个特定的范围,在 lambda 的 where 子句中设置。但是,因为作用域是一个 lambda,它会动态地在 where 子句中获取 key_name。这是最后一个已知的 key_name 变量,它是循环中的最后一个变量,在本例中为“bar”。所以foo_objects 和bar_objects 都返回一组范围为where(var: "bar") 的对象。
通常,lambda 是在 has_many 关系中传递动态范围的好方法,但在这种情况下,我真的不需要它。是否可以在 has_many 关系中设置静态范围?
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord