【发布时间】:2015-07-25 09:17:23
【问题描述】:
我在尝试按命名函数的结果进行分组时收到NoMethodError: undefined method relation' for <Arel::Nodes::NamedFunction:0x7633>。
class Appointment < ActiveRecord::Base
scope :group_by_date, -> { group(date_column) }
def self.date_column
Arel::Nodes::NamedFunction.new(:date, [Appointment.arel_table[:start_time]], 'date')
end
end
Appointment.group_by_date.count
# results in NoMethodError: undefined method `relation' for #<Arel::Nodes::NamedFunction:0x7633>
这似乎完全合理,所以我不确定它为什么会产生错误。正如this SO answer 所示,我很确定这在早期版本的rails 中是可能的。
我希望得到类似于以下 sql 的东西:
SELECT date(appointments.start_time) AS date, COUNT(appointments.*) AS count
FROM appointments
GROUP BY date(appointments.start_time)
有没有办法让它工作?有没有办法将Arel::Nodes::NamedFunction 转换为Arel::Attributes::Attribute
这显然是对解决方案的幼稚尝试(没有奏效):
function = Arel::Nodes::NamedFunction.new('date', [Appointment[:start_time]])
attr = Arel::Attributes::Attribute.new(function)
Appointment.group(attr).to_sql
# NoMethodError: undefined method `table_alias' for #<Arel::Nodes::NamedFunction:0x4b8>
我真的不想重新使用Appointment.group( 'date(appointments.start_time)' ),因为我做了很多范围合并和连接,字符串会造成严重破坏,因为它们并不总是适用于正确的表。
环境:rails (4.1.8), activerecord (4.1.8), arel (5.0.1.20140414130214)
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 arel