Существует удобный динамический атрибут в активной записи, названной find_or_create_by:
Model.find_or_create_by_<attribute>(:<attribute> => "")
Но что, если мне нужно к find_or_create больше чем одним атрибутом?
Скажите, что у меня есть модель для обработки отношений M:M между Группой и участником под названием GroupMember. У меня могло быть много экземпляров, где member_id = 4, но я никогда не хочу несколько раз экземпляр где member_id = 4 и group_id = 7. Я пытаюсь выяснить, возможно ли сделать что-то вроде этого:
GroupMember.find_or_create(:member_id => 4, :group_id => 7)
Я понимаю, что могут быть лучшие способы обработать это, но мне нравится удобство идеи find_or_create.
Несколько атрибутов могут быть связаны с и
:
GroupMember.find_or_create_by_member_id_and_group_id(4, 7)
(используйте find_or_initialize_by
, если вы не хотите сразу сохранять запись)
Изменить: Вышеупомянутый метод устарел в Rails 4. Новый способ сделать это будет:
GroupMember.where(:member_id => 4, :group_id => 7).first_or_create
и
GroupMember.where(:member_id => 4, :group_id => 7).first_or_initialize
Редактировать 2: Не все из них были исключены из рельсов, только специфичные для атрибутов.
https://github.com/rails/rails/blob/4-2-stable/guides/source/active_record_querying.md
Пример
GroupMember.find_or_create_by_member_id_and_group_id(4, 7)
стал
GroupMember.find_or_create_by(member_id: 4, group_id: 7)