Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.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 获取date.year==Rails中某个年份的记录_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 获取date.year==Rails中某个年份的记录

Ruby on rails 获取date.year==Rails中某个年份的记录,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我在Rails 3.1应用程序的数据库中有一个日期列,我希望能够获得日期年份与特定年份匹配的记录。 我尝试了where(:date.year==year)但我当然得到了NoMethodError:undefined方法'year'for:date:Symbol。可以进行这种类型的查询吗?假设您的日期格式为:YYYY-MM-DD HH:MM:SS 试试这个: where(Date.strptime(:date, "%Y-%m-%d %H:%M:%S").year == year) 或 您可以使用

我在Rails 3.1应用程序的数据库中有一个日期列,我希望能够获得日期年份与特定年份匹配的记录。
我尝试了
where(:date.year==year)
但我当然得到了
NoMethodError:undefined方法'year'for:date:Symbol
。可以进行这种类型的查询吗?

假设您的日期格式为:
YYYY-MM-DD HH:MM:SS

试试这个:

where(Date.strptime(:date, "%Y-%m-%d %H:%M:%S").year == year)


您可以使用作用域来构建以下内容:

scope :for_year, lambda {|date| where("date >= ? and date <= ?", "#{date.year}0101", "#{date.year}1231")}

scope:for_year,lambda{| date | where(“date>=”和dateJesse给了您实际解决方案的想法,但要解释为什么失败,因为它试图评估“.year”作为符号的方法,您传递了它:“date”

单词:date只是一个参数,用于告诉“where”,它稍后将使用哪个值来构造要传递给db的SQL查询。 它不会转换为记录的实际日期。但是在使用“:date”符号进行任何操作之前,“.year”将在您将其作为参数传递时进行计算。

在您的模型中:

scope :by_year, lambda { |year| where('extract(year from created_at) = ?', year) }
在控制器中:

@courses = Course.by_year(params[:year])

这给了我
TypeError:can't dup Symbol
你如何得到你的
year
?year是一个方法参数,是一个整数,如2011、2010等。第二个例子给了我:
SQLite3::SQLException:没有这样的函数:year
yes-sqlite没有日期函数(例如year)但mysql确实如此。你可以改用mysql——特别是如果你打算部署它的话。这很有效:
scope:for_year,lambda{year}where(“date>=?和date这些答案很好,但我不知道作用域是什么。所以基本上你必须在model.rb文件中定义作用域。然后作用域就像一个可以调用的普通方法,只是它专门处理活动记录(数据库)在上面的示例中,您可以调用类似user.for_year(1991)的东西,而1991表示| year |。
@courses = Course.by_year(params[:year])