无法访问Rails 4.1中的SQL列别名

时间:2015-11-12 17:09:16

标签: mysql ruby-on-rails ruby ransack squeel

将我的rails应用程序从3.2升级到4.1.13后,我的一个查询似乎没有为ActiveRecord提供别名列(我认为)。如果我运行.to_sql并使用该SQL进行查询,我可以清楚地看到正在返回别名列,但是当我尝试访问它们时,就像以前一样,我得到undefined method错误。

我不确定如何解决这个问题。

查询是根据Ransack搜索和一些Squeel连接构建的。

search_result = search.result.in_current_club_type.
  joins{role.outer}.joins{contact.outer}.for_current_or_last_year.with_fellowship.
  select(<<-SQL
    people.id, people.last_name, people.first_name, people.parent_only, clubs.name AS club_name,
    roles.name AS role_name, tlt, master_guide, pla, grade, people.type, people.email,
    contacts.primary_phone AS phone
  SQL
  )

我需要访问的别名是role_nameclub_namephone。我之后立即放置binding.pry并尝试search_result.first.role_name,并且返回的错误是

NoMethodError: undefined method `role_name' for #<Member:0x007fa8bcf121d0>

我可以将这些转化为实例方法,但我希望能够继续使用现有的做事方式。

感谢您的指导。

1 个答案:

答案 0 :(得分:0)

好的,我不确切知道为什么,但似乎搜索是从需要使用Squeel语法重写的范围构建的。事情正确加入,我可以调用别名列。

旧范围

scope :unapproved, -> { joins(approvals).where('approvals.approved IS NULL OR approvals.approved = ?', false) }

新范围

scope :unapproved, -> { joins{approvals}.where{(approvals.approved == nil) | (approvals.approved == false)} }