2015-08-21 16 views
7

Tôi đã viết một số bài kiểm tra và tôi đã gặp phải một thứ mà tôi đang cố gắng hiểu.Mongoid: 'update_attribute' với [models, ...] vs với [model_ids, ...]

sự khác biệt là gì bên dưới khi gọi:

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

vs

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

Những 2 mô hình trong câu hỏi:

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 

mã kiểm tra trong câu hỏi:

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 

Hy vọng tôi có ý nghĩa, nhờ

+0

Tôi không hiểu bài kiểm tra của bạn. Tách nó trong hai trường hợp thử nghiệm riêng biệt, trong đó một là đi qua và thứ hai là một trong những thất bại. – EugZol

Trả lời

3
  1. Có phải tất cả các thuộc tính của bạn trắng niêm yết đúng cách?

Không có lược đồ cho mô hình, đối tượng tham gia và thử nghiệm thực tế tôi đang nắm bắt ở ống hút, nhưng hoàn toàn dựa trên ví dụ đó, tôi đoán là mô hình đầu tiên chứa thuộc tính được ánh xạ tới trên mô hình thứ hai của bạn và ghi đè lên nó khi bạn truyền toàn bộ đối tượng, nhưng không phải khi bạn chỉ định thuộc tính bạn muốn cập nhật. Dưới đây là một ví dụ: (Tôi không giả sử bạn quên bảng tham gia của mình, tôi chỉ sử dụng điều đó vì điều đầu tiên xuất hiện trong đầu)

vì vậy chúng tôi tạo 2 mô hình, mỗi mô hình có một trường ánh xạ tới 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)) 

vì vậy, tại thời điểm này, khi bạn gọi group.users, nó kiểm tra cho một người dùng với id của 1, bởi vì đó là id của GROUP_USER bạn vừa tạo & thông qua nó, và giả sử bạn có một Người dùng có ID đó trong cơ sở dữ liệu của bạn, bài kiểm tra sẽ trôi qua.

group_user.update_attributes(group_id: group.id) 

Trong trường hợp này, phương thức CHỈ cập nhật group_id, vì vậy mọi thứ vẫn hoạt động.

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

Trong trường hợp này, bạn chuyển toàn bộ đối tượng qua và để nguyên phương pháp quyết định trường nào được cập nhật. Đoán của tôi là một số thuộc tính từ mô hình nhóm của bạn ghi đè thuộc tính có liên quan từ mô hình người dùng của bạn, làm cho thuộc tính này bị ngắt khi KHÔNG có user_ids khớp với bất kỳ giá trị mới nào.

Hoặc thuộc tính không có màu trắng được liệt kê hoặc thử nghiệm của bạn không khả thi.

+0

Để trực tiếp trả lời câu hỏi của bạn, không có sự khác biệt bên dưới. Sự khác biệt là trong những gì bạn đã cho nó: trong một trường hợp bạn chỉ đi qua trong các thuộc tính duy nhất, và trong trường hợp khác, bạn đang đi qua trong bộ sưu tập các thuộc tính. –

+0

Điều này có trả lời câu hỏi của bạn không? Tôi có thể lấy séc không? –

Các vấn đề liên quan