尝试定义按星期几制作日期时间条目的方法

时间:2014-01-09 16:46:33

标签: sql ruby-on-rails

我的一个表(team_opps)中有一个名为start_date的日期时间列。

我正在尝试在我的模型中编写方法,允许我将它们分类为周一,周二等......机会。

  def self.friday_team_opps
    where('WEEKDAY(start_date) = ?', 4)
  end

在我看来,我试图打电话给.each。

  <% TeamOpp.friday_team_opps.each do |team_opp| %>
     <%= render team_opp, :team_opp => :team_opp %>
  <% end %>

错误是:

SQLite3::SQLException: no such function: WEEKDAY: SELECT "team_opps".* FROM "team_opps"  WHERE (WEEKDAY(start_date) = 4)

由于

3 个答案:

答案 0 :(得分:1)

首先,您需要通过将方法定义为def self.friday_team_opps来在TeamOpp类上定义方法。

此外,您无法调用列上的方法,因为它需要ActiveRecord加载表中的所有数据,然后对该数据调用Ruby方法。你可以做的是使用直接的SQL函数,例如MySQL的WEEKDAY(星期一= 0,星期二= 1等):

def self.friday_team_opps
  where("WEEKDAY(team_opps.created_at) = ?", 4)
end

在SQLite中,您可以使用strftime函数(sunday = 0,monday = 1等):

def self.friday_team_opps
  where('strftime("%w", "created_at") = "?"', 5)
end

答案 1 :(得分:0)

您将其定义为实例方法

def friday_team_opps

它应该被定义为类方法

def self.friday_team_opps

答案 2 :(得分:0)

如果你想让它成为一个实例函数,你应该像这样使用它

def friday_team_opps
    return self.start_date.strftime("%A")
end

随后您将不得不修改您的视图:

<% TeamOpp.select("start_date").each do |team_opp| %>
     <%= team_opp.friday_team_opps() %>
<% end %>