我正在构建一个小型体育应用程序,其中包含年、周、比赛和用户的选择。我为 2014 年构建了它,现在为 2015 年构建了它,我正在努力确保它可以轻松地适用于任何年份。
目前,当我调用 user.picks
时,它会返回他们对 2014 年和 2015 年的所有选择。我只想要 2015 年,但我不确定是否更改结构来实现这一点。我确信这是一个简单的解决方案。
是否可以在 pick
上不创建范围
?理想情况下,我想调用 user.picks
而不是 user.picks.for_this_year
。
这是我的数据库结构:
用户.rb
has_many :picks
周.rb
has_many :games
has_many :picks
周有属性,:year
游戏.rb
belongs_to :week
has_many :picks
游戏有函数year
,它查看父week
的年份
Pick.rb
belongs_to :user
belongs_to :game
belongs_to :week
具有函数year
,它查看从父week
获取的父游戏
的年份
感谢您的帮助!
最佳答案
我反对删除 User 和 Pick 之间的关联,因为您会发现自己创建了许多变通办法来适应应用程序中的基本关系。
您可以设置default_scope
class Pick < ActiveRecord::Base
default_scope {joins(:week).where("weeks.year = ?", Time.now.year)}
end
命名范围是首选方式,您可以提供条件参数
class Pick < ActiveRecord::Base
def self.for_year(year=Time.now.year)
joins(:week).where("weeks.year = ?", year)
end
end
您必须调用 user.picks.for_year 或 user.picks.for_year("2014") 但您的代码更清晰且更易于维护。 Default_scopes 不一定是坏事,但很容易忘记已经创建了一个,并且还会导致一些困惑的解决方法。
关于ruby-on-rails - 将 Rails 模型配置为仅返回特定年份的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166782/