将方法添加到对象的活动记录关系



我有一个模型SchoolPerformanceStats具有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)

希望这对你有帮助!👍

相关内容

  • 没有找到相关文章

最新更新