Запрос Ruby on Rails, равный двум объединенным столбцам - PullRequest
0 голосов
/ 04 мая 2018

В моей модели клиента есть поля first_name и last_name. Я могу запросить модель с помощью следующего кода:

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

Однако я хочу запросить модель следующим образом:

Customer.where(full_name: "John Doe")

Но у меня нет столбца с полным именем. Как я могу сделать это без создания поля full_name?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Вы можете использовать оператор CONCAT в SQL:

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

Что может иметь смысл, если вы создаете что-то вроде функции поиска с помощью like / ilike:

Customer.where("CONCAT(first_name, ' ', last_name) LIKE ?", "%#{full_name}%")
0 голосов
/ 04 мая 2018

В качестве альтернативы 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.

0 голосов
/ 04 мая 2018

Вы не можете, если у вас нет атрибута полного имени, вы не можете сделать запрос по полному имени, и любая попытка сделать это с помощью 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

Лично из-за простоты и ясности кода я предпочитаю использовать области видимости вместо методов классов, если не требуется дополнительная логика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...