Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 )