0

検索フォームを持つ材料モデルがあります。検索アクションは次のようになります。

def search
  conditions = {}
  conditions[:version] = 'master'
  conditions[:status] = 'shared'
  conditions[:targ_lang] = params[:targ_lang] unless params[:targ_lang].blank?
  @results = Material.find(:all, :conditions => conditions)
end

act-as-taggable gem を追加しました。タグの保存には問題なく機能しますが、検索フォームへの追加に問題があります。ドキュメントには、タグ付きのマテリアルを見つけるには、次のコードを使用できると記載されています。

Material.tagged_with(["awesome", "cool"], :match_all => true)

しかし、この条件を条件に追加する方法がわかりません。

アップデート

@results = Material.where(conditions) && Material.tagged_with(params[:tag_list])

これはタグが使用されている場合は機能しますが、タグリストが空白の場合は機能しないため、上記の他の条件と同様に、フィールドが空でない場合にのみ Material.tagged_with ... 部分が必要であるという条件が必要です。

更新 2 - 悪い解決策

これは機能しますが、あまりエレガントではありませんか?

if params[:tag_list].blank?
  @results = Material.where(conditions)
else 
  @results = Material.tagged_with(params[:tag_list]).where(conditions)
end
4

1 に答える 1

0

このコードは機能しませんか?

Material.where(conditions).tagged_with(['awesome', 'cool'], :match_all => true)

または逆の順序:

Material.tagged_with(['awesome', 'cool'], :match_all => true).where(conditions)

アップデート

act-as-taggable-onegithubのドキュメントを読むと、という名前のオプションがあります:any。使ってみてもいいかもしれません。私はいくつかのテストを行うことができるプロジェクトを持っていませんが、おそらく次のようなコードです:

Material.tagged_with(['awesome', 'cool', '', nil], :any => true).where(conditions)

試してみる。

于 2013-09-17T12:04:37.510 に答える