我有一个模型School
与PerformanceStats
具有has_many
关系。
我发现自己经常在控制台和一些rake任务中编写这些代码。
School.where(city: "Chicago").joins(:performance_stats).where(performance_stats: {year: "1819"}.where.not(performance_stats: {gr3_score: nil})
我想也许我可以通过在学校的ActiveRecord关系上包含一个方法来缩短这个时间,所以我可以这样做:
School.where(city: "Chicago").pstatjoin("1819","gr_score",nil)
def pstatjoin(year,x,y)
x.to_sym
self.joins(:performance_stats).where(performance_stats: {year: year}.where.not(performance_stats: {x => y})
end
但是我不确定把这段代码放在哪里。
我在SchoolsHelper模块中尝试了这个:
Module SchoolHelper
Class School
def pstatjoin(year,x,y)
x = x.to_sym
self.joins(:performance_stats).where(performance_stats: {year: year}.where.not(performance_stats: {x => y})
end
end
end
,我在学校模型中包含了这个模块
include SchoolsHelper
但这导致undefined method 'pj' for #<School::ActiveRecord_Relation:hexidecimal>)
有没有办法做到这一点,而不添加代码,将适用于每一个ActiveRecord_Relation?
我认为适合这个问题的好方法绝对是范围,有了范围你可以节省一些时间并遵守DRY原则,所以你可以在你的School
模型中定义一个范围,如下所示:
scope :my_awesome_scope, ->(year, x, y) {joins(:performance_stats).where(performance_stats: {year: year}.where.not(x => y)}
那么你可以像下面这样在任何地方使用它:
School.my_awesome_scope(year, x.to_sym, y)
或偶数:School.where(...).my_awesome_scope(year, x.to_sym, y)
希望这对你有帮助!👍