2014-04-15 16 views

Trả lời

42

Từ Guides

first_or_create

Các first_or_create phương pháp kiểm tra xem lợi nhuận đầu tiên Nil hay không. Nếu nó trả về 0, thì tạo ra được gọi. Điều này rất mạnh khi kết hợp với phương thức where. Hãy xem một ví dụ.

Giả sử bạn muốn tìm khách hàng có tên ‘Andy’ và nếu không có khách hàng nào, hãy tạo một khách hàng và đặt thuộc tính bị khóa của mình thành false. Bạn có thể làm như vậy bằng cách chạy:

Client.where(:first_name => 'Andy').first_or_create(:locked => false) 
# => #<Client id: 1, first_name: "Andy", orders_count: 0, locked: false, created_at: "2011-08-30 06:09:27", updated_at: "2011-08-30 06:09:27"> 

SQL được tạo ra bằng phương pháp này trông như thế này:

SELECT * FROM clients WHERE (clients.first_name = 'Andy') LIMIT 1 
BEGIN 
INSERT INTO clients (created_at, first_name, locked, orders_count, updated_at) VALUES ('2011-08-30 05:22:57', 'Andy', 0, NULL, '2011-08-30 05:22:57') 
COMMIT 

first_or_create lợi nhuận hoặc các kỷ lục đó đã tồn tại hoặc kỷ lục mới. Trong trường hợp của chúng tôi, chúng tôi chưa có khách hàng tên là Andy nên hồ sơ được tạo và trả lại.

first_or_create!

Bạn cũng có thể sử dụng first_or_create! để tăng ngoại lệ nếu bản ghi mới không hợp lệ. Xác thực không được đề cập trong hướng dẫn này, nhưng giả sử bạn tạm thời thêm

validates :orders_count, :presence => true 

vào mô hình Khách hàng của bạn. Nếu bạn cố gắng tạo một Ứng dụng khách mới mà không vượt qua đơn hàng_count, hồ sơ sẽ không hợp lệ và ngoại lệ sẽ được nâng lên:

Client.where(:first_name => 'Andy').first_or_create!(:locked => false) 
# => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank 
0

Gets kỷ lục đầu tiên mà khớp với những gì bạn đã xác định hoặc tạo ra một nếu không có trận đấu

0

Nếu bạn kiểm tra nguồn, bạn sẽ thấy rằng chúng gần như giống hệt nhau. Sự khác biệt duy nhất là người đầu tiên gọi phương thức "tạo" và phương thức "tạo"! Điều này có nghĩa là thứ hai sẽ tăng ngoại lệ, nếu việc tạo không thành công.

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