[英]Multi level associations in rails
我正在創建一個應用程序來跟蹤整個賽季的足球隊。 但我被困在數據庫的設計上。 一個裝置有一個主隊和一個客隊。 我創建了一個具有兩個外鍵的夾具模型-home_team和away_team,但是我無法使關聯正常工作。 有任何想法嗎? 每個裝置都屬於一個聯賽。
簡單的答案是:
class Fixture < ActiveRecord::Base
belongs_to :home_team, :class_name => "Team", :foreign_key => :home_team
belongs_to :away_team, :class_name => "Team", :foreign_key => :away_team
end
class Team < ActiveRecord::Base
has_many :fixtures
end
但這對您不利,因為Team.fixtures無法正常工作。
class Team < ActiveRecord::Base
has_many :home_fixtures, :class_name => "Fixtures", :foreign_key => :home_team
has_many :away_fixtures, :class_name => "Fixtures", :foreign_key => :away_team
end
將為您提供兩個集合…但是將它們匯總起來必須使用紅寶石進行,這非常危險。
class Team < ActiveRecord::Base
def fixtures(*args)
home_fixtures.all(*args) + away_fixtures.all(*args)
end
end
這也有問題,排序和限制都將增加(嘿,雙關語,誰知道?)。
class Team < ActiveRecord::Base
has_many :fixtures, :finder_sql => 'SELECT * FROM fixtures where (home_team = #{id} or away_team = #{id})'
has_many :home_fixtures, :class_name => "Fixtures", :foreign_key => :home_team
has_many :away_fixtures, :class_name => "Fixtures", :foreign_key => :away_team
end
這很丑陋,但可能會起作用。 finder_sql似乎可以完成所需的工作。
另一個選擇是使用named_scope:
class Fixture < ActiveRecord::Base
named_scope :for_team_id, lambda{|team_id| {:conditions => ['(home_team = ? or away_team = ?)', team_id, team_id]} }
belongs_to :home_team, :class_name => "Team", :foreign_key => :home_team
belongs_to :away_team, :class_name => "Team", :foreign_key => :away_team
end
class Team < ActiveRecord::Base
def fixtures
Fixtures.for_team_id(id)
end
end
最后一個解決方案是我堅持使用的解決方案,因為它的作用域非常類似於只讀關聯,並防止了:finder_sql
可能在以后發生的:finder_sql
行為(我的意思是真的嗎?它如何知道如何合並更多條件嗎?有時它需要一個子查詢,一個子查詢嗎?
希望這可以幫助。
假設您有一個Team
模型和一個Something
模型,后者將具有home_team_id
和away_team_id
。
class Something < ActiveRecord::Base
belongs_to :home_team, :class_name => 'Team'
belongs_to :away_team, :class_name => 'Team'
您將它們稱為something.away_team
和something.home_team
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.