2013-05-01 22 views
7

Tôi thực sự thích first_or_create phương pháp:First_or_create có cập nhật về trận đấu không?

# Find the first user named Scarlett or create a new one with a particular last name. 
User.where(:first_name => 'Scarlett').first_or_create(:last_name => 'Johansson') 
# => <User id: 2, first_name: 'Scarlett', last_name: 'Johansson'> 

tôi đã tự hỏi làm thế nào tôi cũng có thể có bản cập nhật này người dùng với last_name 'Johannson' nếu nó không có mặt hoặc khác nhau. Tìm cách ngắn nhất để làm điều này. Một lớp lót tương tự như trên sẽ là lý tưởng.

Một cách tiếp cận có thể là using first_or_initialize combined with update_attributes. Mối quan tâm duy nhất tôi có với phương pháp này là nó sẽ chạy một bản cập nhật ngay cả khi có một trận đấu 100% trên các trường được cung cấp.

Trả lời

6

first_or_initialize với update_attributes sẽ ổn. Rails đủ thông minh để update_attributes chỉ truy cập cơ sở dữ liệu nếu có thay đổi được thực hiện (bạn có thể tự xác nhận cho mình bằng cách sử dụng bảng điều khiển/nhật ký).

8

Zaid rất gần đúng.

User.where(first_name: 'Scarlett').first_or_create.update(last_name: 'Johansson') 

Sự khác biệt chi tiết tại đây. (Lưu ý: đây là dành cho Rails 3+ và Rails 4+)

  1. Sự khác biệt giữa first_or_create vs first_or_initialize_initialize sử dụng phương pháp .new và không lưu các bản ghi vs .create và tự động lưu nó.

  2. Sự khác biệt giữa .update vs .update_attributes, .update_attributes là những gì bạn sử dụng khi bạn có một hash của các giá trị, thường đến từ một hình thức nộp như params. Mặt khác, .update phép bạn dễ dàng xác định mỗi thuộc tính như trình bày ở trên (field_column: value, field_column2: value2) vv

Và cũng giống như Zaid nói, nhưng nó áp dụng cho cả .update.update_attributes, đường ray cập nhật cơ sở dữ liệu" ... chỉ số truy cập cơ sở dữ liệu nếu có thay đổi được thực hiện ... "

+0

cập nhật là một phương pháp riêng tư. Gọi nó trong ngữ cảnh này cho phép "NoMethodError: phương thức riêng' cập nhật 'được gọi là ... "Bạn cần sử dụng update_attributes nếu bạn muốn làm tất cả trong một dòng. –

+0

Tôi không chắc cách bạn mã hóa điều này, nhưng bạn cũng không nên gặp bất kỳ vấn đề nào. Tôi hiện đang sử dụng này trong một cái nhìn và điều khiển ở định dạng này: 'Session.where (user_id: @user, legal_case_id: @case) .first_or_create.update (last_active: bây giờ) ' Cập nhật luôn luôn là một cộng đồng phương pháp. (http://apidock.com/rails/ActiveRecord/Relation/update). Ngay cả khi bạn đang sử dụng .update_attributes, đó là bí danh để .update sau Rails 3+ (http://apidock.com/rails/ActiveRecord/Persistence/update_attributes). Vì vậy, nó "gần như" không nên quan trọng một trong hai cách. –