2009-11-16 53 views
1

我已經有了以下情況設置,可以爲具有多個地址和地址類型的引用表建模客戶。數據模型爲 客戶 - 地址:多對多關係,用名爲「位置」的連接表表示。
位置類型 - 位置:一對多,以便位置類型(例如'工作','家')可以有多個關聯到一個位置。在Rails中使用多對多嵌套模型

我試圖實現的是能夠簡單地找到客戶的所有「工作」地址或「交付」地址。同時避免其在連接表位置複製的文本

模型(一個或多個)的樣子:

class Address < ActiveRecord::Base 
    has_many :locations 
    has_many :customers, :through => :locations 
end 

class Customer < ActiveRecord::Base 
    has_many :locations 
    has_many :addresses, :through => :locations do 
    def special_location(loc) 
     find :all, :conditions => ['addr_type == ?', loc] 
    end 
    end 
end 

class Location < ActiveRecord::Base 
    belongs_to :address 
    belongs_to :customer 
    belongs_to :locationtype 
end 

class LocationType < ActiveRecord::Base 
    has_many :locations 
end 

本作的簡單的情況下工作正常:

@customer = Customer.find(1) 
@customer.addresses # return all addresses 

帶有' special_location(「string」)的特殊幫助方法'我可以達到結果。我想知道是我怎麼可能通過使用附加參考表(的locationType)沿

@customer.addresses.find_locationtype("work") 
+0

我忽略了地址與位置之間的一對多關係。達米恩馬修的解決方案更接近需要完成的任務。 – EmFi 2009-11-17 04:37:36

回答

1


東西達到同樣你可以添加一些表中選擇請求中加入。

def find_locationtype(type) 
    find :all, :conditions => ['location_types.name = ?', type], :joins => :location, :locationtype 
end 

當你做customer.find_locationtype('work'),生成的查詢將加入表locationlocationtype。因此,您可以訪問這兩個表中的每個字段,並且可以爲它們添加條件。

+0

此方法是添加到模型還是控制器?在模型上使用它是有意義的,因爲這是請求的信息來源 – 2009-11-24 05:23:04

+1

當然它在模型中。這是邏輯;) – 2009-11-24 08:30:50