gpt4 book ai didi

ruby-on-rails - Rails has_many 自定义 ActiveRecord 关联

转载 作者:太空狗 更新时间:2023-10-30 01:44:52 27 4
gpt4 key购买 nike

我有一个 Teams 模型和一个 Fixtures 模型。 Fixtures 模型有一个客队和一个主队。我遵循了 this answer 中的示例。并让大部分工作正常进行。

class Fixture < ActiveRecord::Base
belongs_to :home, class_name: 'Team'
belongs_to :away, class_name: 'Team'
end


class Team < ActiveRecord::Base
has_many :home_games, :class_name => 'Fixture', :foreign_key => 'home_id'
has_many :away_games, :class_name => 'Fixture', :foreign_key => 'away_id'
end

我希望能够调用@team.fixtures 来获取所有球队赛程的列表,目前@team.home_games 为我提供主场赛程,@team.away_games 为我提供客场赛程。我怎样才能编写类似于 has_many :home_gameshas_many :games,这是最好的方法吗?

最佳答案

我认为最好的方法是为此编写实例方法:

在团队模型中:

def games
Fixture.where("home_id = ? OR away_id = ?", self.id, self.id)
end

像常规方法一样使用它:

Team.first.games
#=> [<Fixture id: ... >, <Fixture id: ... >, ... ]

这应该返回一个 ActiveRecord::Relation,它可重用于作用域链

(这里有一个类似的问题,但是有 has_one: Rails Model has_many with multiple foreign_keys )


此外,您可以使用 Team 的 id 从它创建一个类方法(如果您已经有 team_id 但没有 Team 实例对象):

class Team < ActiveRecord::Base
has_many :home_games, :class_name => 'Fixture', :foreign_key => 'home_id'
has_many :away_games, :class_name => 'Fixture', :foreign_key => 'away_id'

def games
Team.games(self.id)
end

def self.games(team_id)
Fixture.where('fixtures.home_id = ? OR fixtures.away_id = ?', team_id, team_id)
end
end

然后像这样使用它:

Team.games(params[:team_id])
# or
@team = Team.where(id: params[:id]).first
@team.games

关于ruby-on-rails - Rails has_many 自定义 ActiveRecord 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17476521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com