2011-10-28 8 views
0

meta_searchを使用して車のリストをフィルタリングしています。私はmeta_searchと、少なくとも画像を持ってリターン車のみに使用することができます範囲を定義したいスコープを使用してオブジェクトに関連付けられたアイテムのみを表示する

class Car < ActiveRecord::Base 
    has_many :images, :class_name => "CarImage" 
    ...... 
end 

:車のモデルは、次のように定義されています。私はそれを動作させることができる唯一の方法は、スコープ内の参加を書くことですが、それは重複した車のオブジェクトを返すようだ:

scope :with_images, joins(:images) 

私はこのように、異なる値のみを選択しようとした場合:

scope :with_images, joins(:images).select('DISTINCT cars.*') 

...検索結果に依存する他の方法(グループ句を使用した平均およびカウントアグリゲータなど)が混乱します。

scope :published_and_commented, published.and(self.arel_table[:comments_count].gt(0)) 

Iの場合:

Ruby on Rails Guidesをブラウズしている間、私はそれが私の問題を解決する可能性がありますが、それは仕事を得ることができないと私は本当にどのように行うのを理解していない、好奇心の例を見つけましたself.arel_table[:images_count]を使用すると、それは無名オブジェクトだと言います。

アプリケーション全体では、関連テーブルの属性を使用して検索やフィルタリングに問題があります。私たちは単に属性をメインのcarsテーブルに移動するだけでいくつかの問題を解決しましたが、これは高速ですが馬鹿げたものです。

私の意見では、現時点での検索で少なくとも1つの画像を持つすべての車のIDのリストを最初に取得することが考えられます(これは単純なINNER JOINおよびDISTINCT idクエリ)、id-sのリストを使用して通常のクエリを取得しますが、WHERE id IN [id_1, id_2, id_3, ... , id_n]句を使用します。

これはあなたにとって合理的なようですか?そして私はそれをどうやってやるのだろう? :私はちょうどARELまたはMetaWhereで、SQLずにそれを行うことができればD

はまた、あなたがガイドRALSで見つけたもの

答えて

2

を続行するための最も簡単な方法も最速です...いいだろう。

comments_countは、子の数を取得するために関連付けを設定できるcounter_cache htatです。

has_many :images, :class_name => "CarImage", :counter_cache => true 

をそして、あなたは、以前の非既存images_countアクセスできるようになります:

簡単にそれを実装します。

See doc

+0

ニース!私は今counter_cacheについて読んでいる:[RailsCasts](http://railscasts.com/episodes/23-counter-cache-column)。マイグレーションでテーブルに新しい列を追加する必要があるようです...あなたが示唆したように、これまでに 'Unknown key(s):counter_cache'を追加しました。 – Cristian

+0

うん、私はマイグレーションについて忘れてしまった。それはまた、文書の中で説明されている。 – apneadiving

関連する問題