Могу ли я привязать средства поиска на основе динамических атрибутов к объекту?

StackOverflow https://stackoverflow.com/questions/1899960

Вопрос

Не обращайте на меня внимания, я перепутал имена атрибутов :(

Это вполне возможно, если использовать именно тот синтаксис, который я использовал — вам просто нужно уметь писать!


Кажется, я не могу заставить это работать, и это кажется достаточно распространенным сценарием, и должно быть решение, но мне не везет с правильной терминологией, чтобы получить полезный результат Google.

Я хочу сделать это:

u = User.first
u.clients.find_or_create_by_email('example@example.com')

В связи с тем, что новый Client создан с user_id = u.id.

Могу ли я получить хорошие динамические искатели через has_many отношение?Если нет, то почему?

Спасибо :)

Это было полезно?

Решение 2

Это вполне возможно, если использовать именно тот синтаксис, который я использовал — вам просто нужно уметь писать!

Другие советы

Этот

u = User.first
u.clients.find_or_create_by_email('example@example.com')

работает, если у вас установлены отношения has_many.Однако это не вызовет ошибку проверки, если у вас есть какие-либо проверки, установленные для вашего объекта Client, и произойдет автоматический сбой, если проверка завершится неудачей.

Вы можете проверить вывод на консоли, когда сделаете

u.clients.find_or_create_by_email('example@example.com') # => #<Client id: nil, email: 'example@example.com', name: nil, user_id: 1, another_attribute: nil, active: true, created_at: nil, updated_at: nil>

и будет установлен user_id, но не идентификатор клиента, поскольку проверка не удалась и клиент не создан

Таким образом, клиент должен быть создан только в том случае, если вы передали все необходимые атрибуты клиентского объекта и проверка клиентского объекта прошла успешно.

Допустим, ваша модель клиента имеет проверку имени, а также электронной почты, тогда вам следует сделать

u.clients.find_or_create_by_email_and_name('example@example.com', 'my_name') #=> #<Client id: 1, email: 'example@example.com', name: 'my_name', user_id: 1, another_attribute: nil, active: true, created_at: "2009-12-14 11:08:23", updated_at: "2009-12-14 11:08:23">
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top