Могу ли я привязать средства поиска на основе динамических атрибутов к объекту?
-
19-09-2019 - |
Вопрос
Не обращайте на меня внимания, я перепутал имена атрибутов :(
Это вполне возможно, если использовать именно тот синтаксис, который я использовал — вам просто нужно уметь писать!
Кажется, я не могу заставить это работать, и это кажется достаточно распространенным сценарием, и должно быть решение, но мне не везет с правильной терминологией, чтобы получить полезный результат 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">