我正在尝试从AREL获取SQL,但是在我使用的情况下它不起作用average(:stars):
这有效:
Review.where("reviewed_user_id = ?", self.reviewed_user_id).to_sql
#=> "SELECT `reviews`.* FROM `reviews` WHERE (reviewed_user_id = 3)"
Run Code Online (Sandbox Code Playgroud)
这导致NoMethodError:
Review.where("reviewed_user_id = ?", self.reviewed_user_id).average(:stars).to_sql
#=> undefined method `to_sql' for 3:Fixnum
Run Code Online (Sandbox Code Playgroud)
这意味着to_sql调用AREL的结果而不是AREL对象 - 但为什么呢?
如何获取生成的SQL?
我有一个User有模式first_name和last_name属性.使用Arel我想使用CONCAT.来执行全名搜索.我已经阅读了如何在ARel中使用像CONCAT()等函数的帖子?这给了我指示这是可能的,但我不能完全正确的语法.到目前为止我有
class User < ActiveRecord::Base
def self.search(query)
concat = Arel::Nodes::NamedFunction.new 'concat', [arel_table[:first_name], arel_table[:last_name]]
where ...?
end
end
Run Code Online (Sandbox Code Playgroud) 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>
Run Code Online (Sandbox Code Playgroud)
这看起来完全合理,所以我不确定为什么会产生错误。我很确定这在早期版本的 Rails 中是可能的,如这个 SO 答案所示。
我期望得到类似于以下 sql 的内容:
SELECT date(appointments.start_time) AS date, COUNT(appointments.*) AS count
FROM appointments
GROUP BY date(appointments.start_time)
Run Code Online (Sandbox Code Playgroud)
有办法让它发挥作用吗?有没有办法将其转换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>
Run Code Online (Sandbox Code Playgroud)
我真的不想回到 using ,Appointment.group( …