ruby - 评估从另一个方法返回的代码

时间:2014-04-16 23:43:00

标签: ruby-on-rails ruby squeel

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')

我知道必须有办法解决这个问题,现在就不会想到它了。

我正在使用的真实代码比我在这里描述的要复杂得多,但是我已经为这个例子简化了它。

1 个答案:

答案 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;