我的User
模型具有first_name
和last_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
答案 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]]
)