为了便于解释,我正在编写一个用户可以记录其费用的应用程序。
在用户的节目视图中,我只想显示当月的用户费用。
我的费用表如下:
create_table "expenses", force: :cascade do |t|
t.date "date"
t.string "name"
t.integer "cost"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
日期字段采用日期格式,如下所示:Thu, 14 Apr 2016
在我的控制器中,我有类似的东西:
def show
month = Date.today.strftime("%m")
@user = User.find(params[:id])
@expenses = Expense.where(:user_id => @user.id, :date => month)
end
显然,这不会起作用,但我会猜测它会是这样的吗?
任何帮助都会很棒,谢谢!
答案 0 :(得分:8)
通常你可以这样解决它:
Expense.where(date: (Date.today.beginning_of_month..Date.today.end_of_month))
其中定义了可用作BETWEEN x AND y
子句的范围。
如果这是一项常见操作,您可能希望将日期表示为YYYYMM
格式的单独列,以便轻松检索这些列。
答案 1 :(得分:2)
如果您正在使用MySQL,则可以使用提取功能来创建.where:
def show
month = Date.today.strftime("%m")
year = Date.today.strftime("%y")
@user = User.find(params[:id])
@expenses = Expence.where('extract(month from `date`) = ? AND extract(year from `date`) = ? AND `user_id` = ?', month, year, @user.id)
end
没有经过测试,虽然它应该有用。
<强>来源:强>
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html