我的客户模型有first_name
和last_name
字段。我可以使用以下代码查询模型:
Customer.where(first_name: "John").where(last_name "Doe")
但是,我想查询这样的模型:
Customer.where(full_name: "John Doe")
但我没有full_name列。如何在不创建full_name
字段的情况下完成此操作?
答案 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
等名称不起作用。