簡體   English   中英

Rails中的多級關聯

[英]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_idaway_team_id

class Something < ActiveRecord::Base
  belongs_to :home_team, :class_name => 'Team'
  belongs_to :away_team, :class_name => 'Team'

您將它們稱為something.away_teamsomething.home_team

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM