Использование 'CONCAT' w / Arel в Rails 4

у меня есть User модель first_name и last_name атрибуты. Используя Arel, я хотел бы выполнить поиск полного имени, используя CONCAT. Я читал сообщение в как использовать такие функции, как 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

2 ответов


С последним Арелом требуется использовать Arel::Nodes.build_quoted(' ') вместо просто String (''). Так что ответ в наши дни:

SEPARATOR = Arel::Nodes.build_quoted(' ')

Arel::Nodes::NamedFunction.new(
  'concat',
  [arel_table[:first_name], SEPARATOR, arel_table[:last_name]]
)

Если вы хотите равный поиск

 where(concat.eq("john smith"))

 SELECT "users".* FROM "users" WHERE CONCAT("users"."first_name", "users"."last_name") = 'john smith'

Если вы хотите как поиск

where(concat.matches("%john smith%"))

 SELECT "users".* FROM "users" WHERE (CONCAT("users"."first_name", "users"."last_name")) ILIKE '%admin%'

есть другие методы, приведенные в документация что вы можете использовать

возможно, Вам понадобится место в вашем concat

concat = Arel::Nodes::NamedFunction.new(
 'concat',
  [arel_table[:first_name], 
  ' ', 
  arel_table[:last_name]]
)