2

红宝石 2 和导轨 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])从局部变量、方法、块或其他东西中获取并让它来。

我有很多查询,并希望将这段代码包含在一个地方。

我已经尝试了几件事,比如使用带有产量、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')

我知道一定有办法解决这个问题,只是现在还没有想到。

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

4

1 回答 1

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}

连接 where 调用的行为类似于 &

于 2014-04-17T02:26:54.633 回答