2011-09-09 2 views
0

메사 스캔을 만들려고 노력하고 있습니다. 또는 나에게 has_many-association이 type == "Something"과 같은 모든 객체를 제공하는 스코프를 사용하고 있습니다.metasearch has_many all/none이 일치해야합니다.

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

또는 메타 검색 :

:invoice_base_type_equals => "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

사실은 지금 당장 ("where type = 'Invoice'"를 추가하면됩니다), "NOT IN (목록의 ID) "는 수천 개의 ID 목록입니다. – vimaz

+0

송장 기초에 외래 키 값이 저장되어 있고 송장 기초에 연결되지 않은 모든 주문을 찾으려면 모두 확인해야합니다. Ruby에서 배열을 비교하는 것과 같습니다. 나는 그것이 가장 예쁜 것은 아니라는 데 동의한다. 그러나 데이터베이스 수준의 색인 된 열에서이를 수행하는 것은 소프트웨어 측면에서 비교하는 것보다 훨씬 빠릅니다. 특히 그 테이블이 커지면. – agmcleod

+0

이것은 트릭을 수행하지만, 몇 천 개의 레코드가 있으면 곧 비싼 레코드가 시작됩니다. 거기에 더 좋은 해결책이있는 것처럼 느껴집니다. – DavidMann10k