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

使用している宝石へのリンクを含めることができますか? そこにいくつかあります。これには組み込みがあります:https://github.com/mbleigh/acts-as-taggable-on

より一般的に言えば、タグは、オブジェクト自体と一緒に保存するのではなく、別のテーブルとして実装し、オブジェクトに結合するのが最適な場合がよくあります。このようにして、タグ テーブルから結合してオブジェクトを見つけることができます。

より具体的には、最後の方の例は後ろ向きです。あなたが持っている:

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

しかし、あなた (IMHO) は、タグから始めて、オブジェクトにマップし直そうとしているはずです。何かのようなもの:

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