2015-08-21 2 views
7

Я писал несколько тестов, и я столкнулся с чем-то, что я пытаюсь понять.Mongoid: 'update_attribute' с [models, ...] vs with [model_ids, ...]

Какая разница под при вызове:

.update_attributes(:group_ids, [group1.id, group2.id]) 

против

.update_attributes(:groups, [group1, group2]) 

Эти 2 модели в вопросе:

group.rb

class Group 
    include Mongoid::Document 
    has_and_belongs_to_many :users, class_name: "Users", inverse_of: :groups 
end 

user.rb

class User 
    include Mongoid::Document 
    has_and_belongs_to_many :groups, class_name: "Group", inverse_of: :users 
end 

тест-код в вопросе:

g1 = create(:group) 
u1 = create(:user, groups: [g1]) 
g1.update_attribute(:users, [u1]) 
# at this point all the associations look good 
u1.update_attribute(:group_ids, [g1.id]) 
# associations looks good on both sides when i do u1.reload and g1.reload 
u1.update_attribute(:groups, [g1]) 
# g1.reload, this is when g1.users is empty and u1 still has the association 

Надежда Я сделал чувство, благодаря

+0

Я не понимаю вашего теста. Разделите его в двух отдельных тестовых примерах, где один проходит, а второй - сбои. – EugZol

ответ

3
  1. все ваши атрибуты белого перечислены правильно?

Без схемы для моделей, вашего объекта соединения и фактических тестов, которые я хватаю на соломинках, но основываясь исключительно на этом примере, я предполагаю, что первая модель содержит атрибут, который является сопоставлением с непреднамеренным поле на вашей второй модели и перезаписывать его при передаче всего объекта, но не тогда, когда вы укажете атрибут, который хотите обновить. Вот пример: (Я не предполагаю, что вы забыли свою таблицу соединений, я просто использую это, потому что это первое, что приходит на ум)

поэтому мы создаем две модели, каждая из которых имеет поле, которое отображается на user_id

group.create(id:1, user_id:null) 
group_user.create(id:1, group_id: 1, user_id:null) 

group.update_attributes(user_id: (group_user.id)) 

Таким образом, в этот момент, когда вы звоните group.users, он проверяет для пользователя с идентификатором 1, потому что это идентификатор group_user вы только что создали & прошел, и предполагая, что вы есть Пользователь с этим идентификатором в вашей базе данных проходит тест.

group_user.update_attributes(group_id: group.id) 

В этом случае метод ТОЛЬКО обновляет group_id, поэтому все еще работает.

group_user.update_attributes(group_id: group, user_id: group) 

В этом случае вы передаете весь объект, и оставьте его до метода, чтобы определить, какие поля обновляются. Я предполагаю, что некоторые атрибуты из вашей групповой модели переписывают соответствующий атрибут из вашей модели пользователя, в результате чего он прерывается ТОЛЬКО, когда NO user_id соответствует любому новому значению.

Или атрибут не указан в белом списке, или ваш тест неустойчив.

+0

Чтобы более точно ответить на ваш вопрос, нет никакой разницы внизу. Разница заключается в том, что вы ему дали: в одном случае вы передаете только отдельные атрибуты, а в другом - в коллекции атрибутов. –

+0

Это ответ на ваш вопрос? Могу я получить чек? –