无法在 Rails 4.1 中访问 SQL 列别名
Can't access SQL column aliases in Rails 4.1
将我的 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_name
、club_name
和 phone
。我在那之后放置了一个 binding.pry
并尝试 search_result.first.role_name
并且返回的错误是
NoMethodError: undefined method `role_name' for #<Member:0x007fa8bcf121d0>
我可以将它们变成实例方法,但如果可能的话,我希望能够继续使用现有的处理方式。
感谢您的指导。
好的,我不知道确切原因,但似乎搜索是从需要使用 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)} }
将我的 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_name
、club_name
和 phone
。我在那之后放置了一个 binding.pry
并尝试 search_result.first.role_name
并且返回的错误是
NoMethodError: undefined method `role_name' for #<Member:0x007fa8bcf121d0>
我可以将它们变成实例方法,但如果可能的话,我希望能够继续使用现有的处理方式。
感谢您的指导。
好的,我不知道确切原因,但似乎搜索是从需要使用 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)} }