Rails сначала или инициализируется одним значением, но добавляет больше значений, если они созданы
Возьмем, например, следующее:
GroupMember.where(:member_id => 4).first_or_initialize
Что, если я хочу сказать что-то вроде этого -
Если GroupMember с member_id из 4 существует, "найдите его". В противном случае создайте GroupMember с member_id из 4 AND group_id из 7.
Итак, я хочу, чтобы вышеуказанный оператор проверял только member_id. Но если он не существует, я хочу, чтобы он создал группу GroupMember с несколькими атрибутами. Как мне это написать? Я использую rails 4.0.
Ответы
Ответ 1
Это ссылка, которую я использую - http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize
В источнике метода указано:
def first_or_initialize(attributes = nil, &block)
first || new(attributes, &block)
end
Итак, если запись не найдена - она инициализирует новую и переходит к блоку.
Вы можете использовать его:
GroupMember.where(:member_id => 4).first_or_initialize do |member|
member.group_id = 7
end
Он будет выполнять блок только для новой записи.
Ответ 2
Это также работает:
GroupMember.where(member_id: 4).first_or_initialize(group_id: 7)
Атрибуты, переданные first_or_initialize, используются только тогда, когда он создает новую запись, и они объединяются с атрибутами из предложения where.
Ответ 3
Использование
find_or_initialize_by_member_id_and_group_id(member_id, group_id)
вы создадите GroupMember uniq как с помощью member_id, так и с идентификатором группы. (используется только один раз)
Я не уверен, что это выражение будет работать на Rails 4 или нет. Он работает с Rails 3.2
Пожалуйста, проверьте приведенное выше выражение на консоли rails и сообщите мне, если он работает не на.
Update:
В соответствии с кодом консоли ошибки должен быть:
GroupMember.find_or_initialize_by(member_id: member_id, group_id: group_id )
Пожалуйста, проверьте, работает ли изменение или нет
Ответ 4
попробуйте с этим Post.find_or_create_by(member_id: member_id, group_id: group_id )