在Rails 4中使用`CONCAT` w / Arel

时间:2013-12-06 19:08:52

标签: ruby-on-rails ruby ruby-on-rails-4 arel

我的User模型具有first_namelast_name属性。使用Arel我想使用CONCAT执行全名搜索。我已经阅读了How do I use functions like CONCAT(), etc. in ARel?上的帖子,这表明这是可能的,但我无法正确理解语法。到目前为止我已经

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 个答案:

答案 0 :(得分:12)

使用最新的Arel,需要使用Arel::Nodes.build_quoted(' ')而不是String(&#39;&#39;)。所以现在的答案是:

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

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

答案 1 :(得分:6)

如果你想要一个平等的搜索

 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%'

您可以使用documentation中提供的其他方法

您可能需要在concat中有空格

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