2013-07-21 43 views
0

我希望能够在我的Micropost模型中进行搜索。 Microposts拥有艺术家和歌曲属性。我使用acts_as_taggable gem来标记这些微博。在数组内简单搜索

型号微柱:

def self.search(search) 
    arel = order('created_at') 
    arel = arel.where('UPPER(artist) LIKE UPPER(?) OR UPPER(song) LIKE UPPER(?)', "%#{search}%", "%#{search}%").order('created_at') if search.present? 
    arel 
end 

此代码可以让我寻找歌手和歌曲,但我怎么也搜索标签?

Micropost.find(1).tags添加返回[#ActsAsTaggableOn ::标签ID:18,名称: “摇滚”,#ActsAsTaggableOn ::标签ID:3,名称: “RAP”]

微柱。 find(1).tags.map(&:name)返回一个类似于[“rock”,“rap”的数组]

如何查询micropost的标签不在表格中以及艺术家和歌曲?谢谢。

有点像添加另一个where()像?

where(self.tags.map(&:name), 'LIKE UPPER(?)', "%#{search}%") 

回答

0

您能否包含您正在使用的宝石的链接?那里有几个。这个有内置:https://github.com/mbleigh/acts-as-taggable-on

更一般地说,标签通常是最好的实现为一个单独的表,然后加入到对象,而不是与对象本身存储。这样,您可以从标签表中加入以查找对象。

更具体地说,您的示例接近尾端看起来倒退。您有:

where(self.tags.map(&:name), 'LIKE UPPER(?)', "%#{search}%") 

但是你(恕我直言)应尝试启动与标签和映射回对象。例如:

Tag.where('LIKE UPPER(?)', "%#{search}%").microposts