ruby-on-rails - 将 Rails 模型配置为仅返回特定年份的对象

标签 ruby-on-rails activerecord

我正在构建一个小型体育应用程序,其中包含年、周、比赛和用户的选择。我为 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/

相关文章:

jquery - RoR 中的 AJAX 请求和 CookieOverflow

ruby-on-rails - 如何在 Ruby on Rails 中为复选框添加多个选项?

ruby-on-rails - 有没有办法检查从 ActiveRecord 查询返回的空数组?

mysql - Rails 统计记录而无需再次查询

mysql - Active Record 和迁移格式错误的日期

ruby-on-rails - 从 Json 创建一个 ActiveRecord 实例

ruby-on-rails - content_tag_for 一个 Rails 中的集合?

sql - Rails 5 - ActiveRecord - 过滤 has_many 关系包含但不排除空值

ruby-on-rails - 如何获取 Rails 表中每个不同名称的第 n 条记录?

ruby-on-rails - Multi-Tenancy 应用程序的授权 gem?