2011-09-12 44 views
0

,使用Rails 2.1過濾:軌在反射性,鑑於以下車型的關係

class Product < ActiveRecord::Base 
    has_many :from_sources, :class_name => 'ProductSource', :foreign_key => 'to_product_id' 
    has_many :to_sources, :class_name => 'ProductSource', :foreign_key => 'from_product_id' 

    has_many :from_products, :through => :from_sources 
    has_many :to_products, :through => :to_sources 
end 

class ProductSource < ActiveRecord::Base 
    belongs_to :from_product 
    belongs_to :to_product 
end 

class Supplier < ActiveRecord::Base 
    has_many :products 
end 

我真的不能找到一種方法來過濾來自其他供應商供應商的產品。

讓我給和示例用一些數據

  • 供應商SA具有產品SAPA,SAPB
  • 供應商SB產品已SBPA,SBPB
  • 供應商SC擁有產品SCPA(從SBPB重新分配),SCPB (從SAPB重新分配)

我想篩選:來自供應商SC的產品只有來自SB的產品。

謝謝!

回答

0

不知道我是否很好地理解您的架構,但我認爲你至少需要您的產品belong_to供應商,這樣你就可以篩選產品表在此基礎上的供應商提供的:

Product.find(:conditions => {:supplier_id => @sb.id}) 

你現在可以:

  • 找到所有產品WHERE供應商的ID是SC的ID,
  • INNER JOIN他們自己from_products,
  • 過濾行WHERE from_products'supplier_id是SB的ID,
  • 並最終在篩選的行上選擇DISTINCT ID,以便只有一次SCPB出現。

所以實際的SQL查詢應該是這樣的:

SELECT DISTINCT products.id, (etc...) 
FROM products, product_sources 
    INNER JOIN product_sources 
    ON products.from_sources = product_sources.id 
    LEFT JOIN products AS source 
    ON product_sources.id = source.id 
WHERE products.supplier_id = (SC's id) AND source.supplier_id = (SB's id) 

對不起了,但是我沒有真正熟悉的軌道2查詢界面(軌道3是如此甜蜜),所以我不能告訴更多,但我認爲這是正確的邏輯。

+0

是的,讓supplier_id使事情變得簡單,但我一直想知道如何用像這樣的反身關係來過濾模型。 謝謝! – brauliobo