2つのカラムをくっつけて、likeで検索する方法

first_name, last_nameを二つのカラムがあるとします。

これを合わせて、両方をくっつけた場合の検索をしたい時です。

select first_name, last_name
  from users
 where type = "#{type}"
   AND CONCAT(first_name, last_name) like ?

CONCATを使用して、カラムをくっつて検索すれば大丈夫です。

やりたかったことは、同一の姓名は登録させたくありませんでした。

railsSTIで使用したので、こんな感じになりました。

  validate :validate_full_name

  def validate_full_name
    full_name = first_name + last_name
    type = model_name.name
    sql = <<-SQL
select first_name, last_name
  from users
 where type = "#{type}"
   AND CONCAT(first_name, last_name) like ?
    SQL
    result = User.find_by_sql([sql, full_name])
    errors.add(:full_name, "はすでに登録されています") if result.present?
  end

stiで継承しているので、typeをmodel_nameから取ってくるようにしました。

本当はテーブル名も直書きではなく、取得してきたかったのですが、うまくテーブル名になるのがなかった。

self.class.super_class.table_name

とすると、文字列になるので、これでエラーになってしまう・・・orz