2011-09-09 28 views
0

私はmetasearchまたは代わりにスコープを作成しようとしていますが、そのhas_many-associationのいずれかがtype == "Something"に等しいオブジェクトはありません。metasearch has_many all/noneは一致する必要があります

例:今、私はどのように行うのか

:invoice_base_type_equals => "Invoice" 

joins(:invoice_base).where(:invoice_base => {:type => "Invoice"}) 

またはメタサーチ:

class Order < ActiveRecord::Base 
    has_many :billing_base 
end 

class InvoiceBase < ActiveRecord::Base 
    belongs_to :order 
end 

class Invoice < InvoiceBase 
end 

class OrderAcknowledgement < InvoiceBase 
end 

請求書が簡単にカスタムスコープによって行われてきた注文を検索反対に、請求書のない注文を見つけますか? (OrderAcknowledgementsは常に許可する必要があります)

答えて

0

私のコンピュータでこれを調べようとすると、私はサブクエリを含むSQL文を書くことになりました。おそらく、生のSQLをwhereメソッドに入れることができるのだろうかと思います。

select * from orders where orders.id not in (SELECT invoice_bases.order_id from invoice_bases); 

where("orders.id not in (SELECT invoice_bases.order_id from invoice_bases)") 

私はこれを私のサイトで試してみたところ、うまくいきました。私がMySQLを使用していることに注意してください。

+0

これは実際に私が今やっている方法です( "type = 'Invoice'"を追加しています)が、 "NOT IN (idsのリスト) "は何千というIDのリストになります。 – vimaz

+0

請求書ベースに外部キーの値が格納されているため、請求書ベースに接続されていないすべてのオーダーを検索するには、すべてをチェックする必要があります。 Rubyで配列を比較するのと同じように考えてください。私はそれが一番美しいものではないことに同意します。しかし、データベースレベルのインデックス付きの列でそれを行うことは、ソフトウェア側で比較するよりはるかに高速です。特にそのテーブルが大きくなると。 – agmcleod

+0

これはトリックですが、NOT INが本当に高価になるのを始めた数千のレコードがあるとすぐに。そこにはもっと良い解決策があるような気がする。 – DavidMann10k

関連する問題