2011-02-12 251 views
0

使用框架的结果,我需要2个ActiveRecord的范围:呼叫来电呼叫

scope :tagged_with, lambda { |tag| {:conditions => [" tags like ? ", "% #{tag} %"] } } 
scope :tagged_with_any, lambda { |tag_array | [HERE NEW IMPLEMENTATION] } 

我想第二个范围是基于第一个范围。如果你会做硬编码,你会为一个2元素的数组做:

lambda { | tag_array | tagged_with(tag_array[0]).tagged_with(tag_array[1]) } 

其作品,但我怎么做通用

lambda { | tag_array | tags.each { |t| tagged_with(t) } } 

显然不会做的工作。

+0

你究竟想要什么? “tagged_with_any”表示ANY,但范围的连接表示ALL。 – tokland 2011-02-12 13:42:09

+0

任何对我而言意味着'a或b或c是真的' – Beffa 2011-02-12 14:05:59

回答

1

这是可以接受的吗?

named_scope :tagged_with_all, lambda { |tag_array| tag_array.inject(self, :tagged_with) } 

因为它的确是这样,所以改名为tagged_with_all。对于tagged_with_any,名为范围的Vanilla不执行OR连接;从示波器手动连接OR条件是可行的,但有点麻烦。请注意,您有像Arel或Metawhere这样的库。