0

我希望能够在我的 Micropost 模型中进行搜索。微博具有艺术家和歌曲属性。我使用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::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}%")
4

1 回答 1

0

您可以包含指向您正在使用的 gem 的链接吗?有几个。这个内置了:https ://github.com/mbleigh/acts-as-taggable-on

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

更具体地说,您在结尾处的示例向后看。你有:

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

但是您(恕我直言)应该尝试从标签开始并映射回对象。就像是:

Tag.where('LIKE UPPER(?)', "%#{search}%").microposts
于 2013-07-22T01:45:45.683 回答