5

私が開発中の Rails 3 Web サイトの検索機能で小さな問題が発生しました。次のような単純なPostモデルがあります。

class Post < ActiveRecord::Base
  acts_as_taggable
end

acts_as_taggable_on投稿にタグを追加するのを少し簡単にするために使用しています。「rails」とタグ付けされた投稿があり、次のようにすると、すべてうまくいきます。

@posts = Post.tagged_with("rails")

つまり、投稿のタイトルも検索したいのです。「Hello world」というタイトルで「rails」というタグが付けられた投稿がある場合、「hello」または「rails」で検索してこの投稿を見つけられるようにしたいと考えています。だから私は、メソッドが提供するLIKEものと組み合わせて、タイトル列のステートメントが必要です。の代わりに使用するため、スコープは機能しません。tagged_withacts_as_taggable_onwhereANDOR

問題が解決することを望んmeta_searchでいましたが、これは私にとってはうまくいきません。私はいくつかのことを試しました。私が試した2つの例を次に示します。

@search = Post.search(:tagged_with_or_title_like => params[:search])
@search = Post.search(:title_like => params[:search], :tagged_with => params[:search])

「tagged_with」を認識しないだけです。を使うのは初めてmeta_searchなので、ここで何か間違ったことをしているかもしれません。searchlogic;) と組み合わせて動作するものをどこかで読んだことacts_as_taggable_onがありますが、Rails 3 をサポートしていないため、使用できません。

ここの誰かがこの問題を解決してくれることを願っています。と組み合わせる方法を知っている人はacts_as_taggable_onmeta_searchますか?それとも、なしで解決策を知っていmeta_searchますか? acts_as_taggable_onまた、それが機能するためのより良いオプションがあれば、それmeta_searchも聞きたいです。:)

編集:tagged_withまたは を使用せずに動作するようになりましたmeta_search。次のように見えました。

Post.select("DISTINCT posts.*").joins(:base_tags).where("posts.title LIKE ? OR tags.name = ?", "%"+params[:search]+"%", params[:search])

作成されたクエリはばかげていたので、別のルートを試しましacts_as_taggable_onmeta_search。自分でタグ テーブルを作成し、それを で投稿に接続しましたhas_and_belongs_to_many。タグに接続する必要があるテーブルは他にないので、これでうまくいきます。タグとタイトルの両方を検索するスコープを作成しました。

scope :search, lambda { |search| select("DISTINCT posts.*").joins(:tags).where("posts.title LIKE ? OR tags.name = ?", "%"+search+"%", search) }

これで、次のことができます。

Post.search(params[:search])

それはうまく機能し、クエリも非常に優れています。それでも、誰かがより良い方法を知っているなら、教えてください。また、Google経由でここに来る人々にとっても役立つかもしれません.

4

2 に答える 2

7
Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]})

楽しい

于 2011-07-08T17:28:51.730 に答える
1

あなたが検討している解決策は、データベース VIEW を新しいモデルとして使用していると思います。

結合テーブルの投稿とタグを含むビューを作成できます。

その後、問題なく meta_search を使用して検索できます。

于 2011-04-24T00:05:37.390 に答える