2012-08-22 93 views
1

我正在寫一個關於釣魚的應用程序。三種模式的非典型協會

  • 我們有一個fish模型,其中包含一些物種。
  • 我們有一個location模型,其中包含捕魚點。
  • 我們有一個technique模型,其中包含一些捕魚技術。

每個location可能有多個fish,所以:

class Location < ActiveRecord::Base 
    has_many :fish 
end 

每個fish可以在多個位置找到,所以:

class Fish < ActiveRecord::Base 
    has_many :locations 
end 

頭痛配備了第三種模式,因爲每個fish可能會被多個techniques捕獲,這取決於location。換句話說:fishtechnique之間存在類似location之間的多對多關係。

我應該使用什麼樣的關聯?

+0

是技術和魚有關的或的關係是唯一的位置和技術之間。你能想出一個更精確的例子嗎? – rangalo

+0

當然!我想在BLUEDEEPS(地點)釣魚鯊魚(魚),我可以釣魚他們(捕魚技術)或鑄造(技術)。在GREENROCK(地點),我可以釣魚他們CASTING(技術)或NET(技術)。但是在GREENROCK(位置​​),我可以通過SPEARFISHING(技術)來釣魚SEA BASS(魚)。是的,這是一個三角關聯... – albertedevigo

回答

2
class Location < ActiveRecord::Base 
    has_many :location_fishes 
    has_many :fishes, :through => :location_fishes 
end 

class Fish < ActiveRecord::Base 
    has_many :location_fishes 
    has_many :locations, :through => :location_fishes 
end 

class LocationFish < ActiveRecord::Base 
    belongs_to :fish 
    belongs_to :location 

    has_and_belongs_to_many :techniques 
end 

請注意,模型和關係的名稱可以改進。你也需要爲這些創建適當的遷移,特別是你不應該忘記創建habtm加入表。

有了這些定義,你可以做這樣的事情:

location = Location.find_by_name("Fancy lake") 
some_fish = Fish.find_by_name("Trout") 
techniques_for_location_and_fish = location.location_fishes.where(:fish_id => some_fish.id).first.techniques 
+1

太棒了!有效! – albertedevigo