【问题标题】:Rails - get records that match a particular wdayRails - 获取与特定 wday 匹配的记录
【发布时间】:2016-03-10 21:39:00
【问题描述】:

尝试查找特定日期的记录,然后一起添加一个字段。

days = 7.times

  days.each do |day|
    today = Date::DAYNAMES[day]
    @dailysheets = @timesheet.sheets.where(:date.strftime("%A") == today)
    @dailyhours =+ @dailysheets.sum(:hours)
  end  

问题是我不能在 where 条件下使用 .strftime...

有没有办法重构它来工作?

【问题讨论】:

  • 您可能不应该这样做。您正在将一个查询变成七个查询。您应该加载所有记录(假设它是一组相当小的记录)并在 Ruby 中对它们进行分区。
  • 想知道替代方案吗?我这样做 7 次的原因是,如果有多个记录,我可以每天检查记录,然后将它们组合在一起。这部分不太相关,因为它会改变 = @dailyhours =+ @dailysheets.sum(:hours) 但找到每天的记录是这里的问题......

标签: ruby-on-rails postgresql ruby-on-rails-4


【解决方案1】:

您必须使用特定于数据库的功能来实现您要查找的内容。使用 Postgres,您可以通过执行以下操作来实现您的目标:

@timesheet.sheets.where("to_char(date, 'day') = ?", Date.today.strftime('%A').downcase)

由于您将手动创建 SQL 字符串,因此您应该确保在列名前加上适当的表名,以避免在查询中加入其他表时发生列名冲突。

【讨论】:

  • 我收到一个错误,因为时间表通过 timesheet_rows 有很多工作表。我收到错误 PG::UndefinedFunction: ERROR: function char_at(date, unknown) does not exist LINE 1: ..." WHERE "timesheet_rows"."timesheet_id" = $1 AND (char_at(da... ^ HINT: No函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。:SELECT "sheets".* FROM "sheets" INNER JOIN "timesheet_rows" ON "sheets"."id" = "timesheet_rows"."sheet_id" WHERE "timesheet_rows"."timesheet_id" = $1 AND (char_at(date, 'day') = 'Sunday')
  • 哎呀,抱歉。应该是to_char(date, "day")。上面固定。
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多