繁体   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