私が開発中の 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_with
acts_as_taggable_on
where
AND
OR
問題が解決することを望ん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_on
いmeta_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_on
たmeta_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経由でここに来る人々にとっても役立つかもしれません.