Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将Rails模型配置为仅返回特定年份的对象_Ruby On Rails_Activerecord - Fatal编程技术网

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

Ruby on rails 将Rails模型配置为仅返回特定年份的对象,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在开发一个小的体育应用程序,里面有年、周、游戏和用户选择。我为2014年建造了它,现在为2015年建造,我正在努力让它在任何年份都能轻松使用 目前,当我调用user.picks时,它会返回2014年和2015年的所有选择。我只想要2015年,但我不确定是否要改变结构来实现这一目标。我相信这是一个简单的解决方案 是否可以不在拾取上创建范围?理想情况下,我想为今年的比赛打电话给user.picks,而不是user.picks 以下是我的数据库结构: User.rb has_many :picks

我正在开发一个小的体育应用程序,里面有年、周、游戏和用户选择。我为2014年建造了它,现在为2015年建造,我正在努力让它在任何年份都能轻松使用

目前,当我调用
user.picks
时,它会返回2014年和2015年的所有选择。我只想要2015年,但我不确定是否要改变结构来实现这一目标。我相信这是一个简单的解决方案

是否可以不在
拾取
上创建
范围
?理想情况下,我想为今年的比赛打电话给
user.picks
,而不是
user.picks

以下是我的数据库结构:

User.rb

has_many :picks
has_many :games
has_many :picks
belongs_to :week
has_many :picks
belongs_to :user
belongs_to :game
belongs_to :week
Week.rb

has_many :picks
has_many :games
has_many :picks
belongs_to :week
has_many :picks
belongs_to :user
belongs_to :game
belongs_to :week
周具有属性,
:年

Game.rb

has_many :picks
has_many :games
has_many :picks
belongs_to :week
has_many :picks
belongs_to :user
belongs_to :game
belongs_to :week
游戏有一个功能
year
,可以查看家长
周的年份

拾取.rb

has_many :picks
has_many :games
has_many :picks
belongs_to :week
has_many :picks
belongs_to :user
belongs_to :game
belongs_to :week
具有函数
year
,该函数查看从父方
周获得的父方
游戏
的年份


谢谢你的帮助

您可以从
用户
模型中删除
has\u many:picks
,并在
用户
模型中创建自定义函数
picks

class User < ActiveRecord::Base
  ...
  def picks
    Pick.joins(:User, :Week).where("users.id = ? and weeks.year= ?",self.id, Time.now.year).distinct
  end
end
class用户
我反对删除用户和Pick之间的关联,因为您会发现自己创建了许多变通方法来适应应用程序中的基本关系

您可以设置一个默认的\u范围

class Pick < ActiveRecord::Base
  default_scope {joins(:week).where("weeks.year = ?", Time.now.year)}
end
class Pick
命名范围是首选方式,您可以提供条件参数

class Pick < ActiveRecord::Base
  def self.for_year(year=Time.now.year)
    joins(:week).where("weeks.year = ?", year)
  end
end
class Pick

您将不得不调用user.picks.for_year或user.picks.for_year(“2014”),但您的代码更清晰,更易于维护。默认范围并不一定是坏的,但很容易忘记创建了一个范围,也会导致一些混乱的解决方法。

您需要在控制器中执行此操作,模型只是数据的表示形式。控制器负责过滤。在模型中应该有一种方法来实现这一点。使用
scope
就是一个例子,但是如上所述,我想调用
.picks
。您可以设置一个作用域并在控制器中使用该作用域,而不是
.picks.picks今年。您也可以将作用域设置为默认作用域,但请注意这种方法。@margo谢谢您的建议。您能否在免责声明中将作用域设置为默认作用域后留下答案?这就是我所寻找的,我相信并且可以给你荣誉。根据@The Fabio的评论,你可以这样做:
default\u scope{where(“game.yearField>=?”,Time.now.year)}
关于这个问题的一个问题,
pick
没有
year
<代码>游戏
可以。和
挑选
属于
游戏
哦。。。好吧,这改变了游戏。。。给我一分钟我会尝试另一种方法