создать запрос активной записи для виртуального атрибута в Rails 5 или 6 - PullRequest
0 голосов
/ 08 января 2020

Если у меня есть виртуальный атрибут, такой как full_name, состоящий из first_name + "" + last_name, и я хочу найти пользователей с User.where(full_name: "John Whoosiwhatsit"), как я могу это сделать?

Это, очевидно, было невозможно в Rails 3 (или какими бы то ни было текущими 8 лет go) , но, похоже, с тех пор это могло быть возможно.

И да Я знаю, что в данном примере есть проблемы, когда у вас есть «Anne Mar ie Van Der Moss», но вопрос в том, как сделать этот тип вещи, а не в том, является ли конкретный пример хорошей идеей. или легко реализовать хорошо.

1 Ответ

3 голосов
/ 08 января 2020
User.select("users.*", "CONCAT(users.first_name, ' ', users.last_name) AS full_name")
    .where(full_name: "John Whoosiwhatsit")

Это будет работать на MySQL, Postgres и SQLite (и, вероятно, больше). ActiveRecord отобразит любые псевдонимы столбцов в результирующих строках запроса как атрибуты в модели.

Некоторые базы данных (например, Oracle) не позволяют использовать псевдонимы в предложении WHERE, поэтому вам придется повторить конкатенация:

# Use an Enterprise DB they said. It will be fun they said.
User.select("users.*", "CONCAT(users.first_name, ' ', users.last_name) AS full_name")
    .where("CONCAT(users.first_name, ' ', users.last_name) = 'John Whoosiwhatsit'")

Вероятно, это работало практически во всех версиях, поскольку Rails AFAIK всегда позволял вам возвращаться к raw SQL при необходимости.

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