繁体   English   中英

Ruby on Rails查询等于两个连接列

[英]Ruby on Rails query where equal to two concatenated columns

我的客户模型有first_namelast_name字段。 我可以使用以下代码查询模型:

Customer.where(first_name: "John").where(last_name "Doe")

但是,我想查询这样的模型:

Customer.where(full_name: "John Doe")

但是我没有full_name列。 如何在不创建full_name字段的情况下完成此操作?

您可以在SQL中使用CONCAT运算符:

Customer.where("CONCAT(first_name, ' ', last_name) = ?", full_name)

如果您使用like / ilike创建类似搜索功能的东西,这实际上可能有意义:

Customer.where("CONCAT(first_name, ' ', last_name) LIKE ?", "%#{full_name}%")

您不能,如果您没有全名属性,则无法通过全名查询,并且在单个查询中使用ActiveRecord进行任何尝试都会为您的应用(或模型)增加额外的复杂性,但要解决您的问题简单的问题,您可以向Customer模型添加范围,或者将名字和姓氏作为参数传递的类方法。

使用范围

scope :by_full_name, (lambda { |first_name, last_name|
  where(first_name: first_name, last_name: last_name)
})

使用静态(类)方法

def self.by_full_name(first_name, last_name)
  where(first_name: first_name, last_name: last_name)
end

就个人而言,由于简单和清晰的代码,如果不需要额外的逻辑,我更喜欢使用范围而不是类方法。

作为Max的替代方法,请在问题中拆分两个字段上的名称和查询。

scope :where_full_name, ->(full_name) do 
  (first_name, last_name) = full_name.split(/\s+/)
  where first_name: first_name, last_name: last_name
end

然后用

Customer.where_full_name 'Betty Davis'

这对Joan van der Graff这样的名字不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM