ruby 2和rails 4
考虑这段代码:
Post.where{
(created_by == user) &
(
(group_id.in [1,2,3,4]) | (event_id.in [5,6,7,8])
)
}
单独工作正常。
我想做的是取(group_id.in [1,2,3,4]) | (event_id.in [5,6,7,8])
并将其来自局部变量,方法,块或其他东西。
我有很多疑问,希望这一段代码包含在一个地方。
我尝试了几件事,比如使用带有yield,Proc和lambas的块。我似乎一直陷入困境:NameError (undefined local variable or method 'group_id')
注意:我使用的是squeel,它包含自己的DSL,它的块使用instance_eval
。哪个应该没问题,因为我可以通过my{<method_name_here>}
访问。
以下是我的尝试:
viewable_areas = lambda { (group_id.in [1,2,3,4]) | (event_id.in [5,6,7,8]) }
Post.where{
(created_by == user) &
(
my{viewable_areas.call}
)
}
我能得到的最好的是:NameError (undefined local variable or method 'group_id')
我知道必须有办法解决这个问题,现在就不会想到它了。
我正在使用的真实代码比我在这里描述的要复杂得多,但是我已经为这个例子简化了它。
答案 0 :(得分:2)
使用命名范围:
class Post << ...
scope :viewable_areas, lambda {|group_ids, event_ids| where{(group_id.in group_ids) | (event_id.in event_ids)}
end
Post.viewable_areas([1,2,3,4],[5,6,7,8]).where{created_by == user}
串联调用的位置如&amp;