我希望能够在我的Micropost模型中搜索。 Microposts具有艺术家和歌曲属性。我正在使用acts_as_taggable gem标记这些微博。
Micropost模型:
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 :: Tag id:18,name:“rock”,#ActsAsTaggableOn :: Tag id:3,name:“rap”]
Micropost.find(1).tags.map(&:name)返回类似[“rock”,“rap”]的数组
如何用它来查询微博的标签不在它的表格中,还有艺术家和歌曲?谢谢。
像添加另一个where()之类的东西?
where(self.tags.map(&:name), 'LIKE UPPER(?)', "%#{search}%")
答案 0 :(得分:0)
您是否可以添加指向您正在使用的宝石的链接?那里有一些。这个内置于:https://github.com/mbleigh/acts-as-taggable-on
更一般地说,标签通常最好实现为单独的表,然后连接到对象,而不是与对象本身一起存储。这样您就可以从tags表中加入以查找对象。
更具体地说,你的例子接近结尾看起来倒退了。你有:
where(self.tags.map(&:name), 'LIKE UPPER(?)', "%#{search}%")
但是你(恕我直言)应该尝试从标签开始并映射回对象。类似的东西:
Tag.where('LIKE UPPER(?)', "%#{search}%").microposts