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

时间:2018-05-04 16:02:41

标签: ruby-on-rails ruby ruby-on-rails-5

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

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

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

Customer.where(full_name: "John Doe")

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:1)

您不能,如果您没有全名属性,则无法通过全名查询,并且在单个查询中使用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

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

答案 2 :(得分:1)

作为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等名称不起作用。