2013-07-29 26 views
5

Tôi có một vật cố cho mô hình "SoftwareVersion":Rails, đồ đạc và default_scope

testing: 
    id: 4 
    version: "4.0" 
    file_name: MyString4 
    is_testing: true 

Và một phạm vi mặc định cho các mô hình:

default_scope where(is_testing: false) 

Nếu tôi làm điều này trong một bài kiểm tra:

software_versions(:testing) 

tôi nhận được một lỗi:

ActiveRecord::RecordNotFound: Couldn't find SoftwareVersion with id=4 [WHERE `software_versions`.`is_testing` = 0] 

Hành vi đó có dự định không? Và làm cách nào để ghi đè lên nó?

+0

Cũng trong lịch thi đấu yo xác định rằng is_testing là đúng và phạm vi mặc định của mô hình là 'is_testing: false' để làm thế nào có thể tìm thấy bản ghi? –

Trả lời

3

Có đây là hành vi dự định, Phạm vi mặc định sẽ ảnh hưởng đến tất cả các truy vấn. Sử dụng unscoped để bắt đầu một truy vấn sạch một lần nữa:

SoftwareVersion.unscoped.where(is_testing: true) 
SoftwareVersion.unscoped.find(id: 4) 
etc. 

Nhưng điều đó ngoài, nếu bạn đang sử dụng cùng một bảng (với đồ đạc) để lưu trữ cả sản xuất và kiểm thử các hồ sơ, sau đó bạn đang làm nó sai. Rails sử dụng một cơ sở dữ liệu hoàn toàn khác để thử nghiệm, vì vậy bạn không cần một cột để phân biệt. Và nếu bạn đặt các đồ đạc dưới test/fixtures, chúng sẽ không bao giờ được tải trong sản xuất cả.

+0

Ồ - trường is_testing được sử dụng để xác định xem SoftwareVersion có phải là phiên bản thử nghiệm chỉ dành cho các đơn vị kiểm tra (máy tính) hoặc nếu chúng sẵn sàng để sử dụng sản xuất :-) Thuật ngữ là từ một ứng dụng sản xuất thực tế. – jriff

+0

Aha - cảm ơn vì đã làm rõ, nhưng đó chỉ là một phần phụ. Liệu 'unscoped' có trả lời câu hỏi của bạn không? – Subhas

+0

Nó không và nó không. Tôi biết rằng tôi có thể sử dụng unscoped để có được kỷ lục. Những gì tôi muốn là để có thể sử dụng các phần mềm viết tắt (: kiểm tra). Để giữ mã sạch sẽ và gọn gàng. Nhưng tôi đoán rằng đây là cách duy nhất để làm điều đó - vâng. Cảm ơn bạn. – jriff

2

Hành vi như dự định, vấn đề duy nhất là trên cơ sở dữ liệu thử nghiệm của bạn, không có bản ghi của SoftwareVersion. Bạn chỉ cần điền vào cơ sở dữ liệu trước khi chạy thử nghiệm. Như bạn thấy, truy vấn được thực hiện hoàn hảo, WHERE software_versions.is_testing = 0, với số không có nghĩa là false như trong số default_scope của bạn.

+0

Tôi đồng ý rằng đó là điều hiển nhiên. Nhưng rất khó sử dụng vật cố khi không thể tham chiếu. Một trong những nhu cầu để có thể để có được các vật cố định unscoped ... – jriff

+0

Hmm, tôi nhìn thấy. Vấn đề là phương thức '.where' truy vấn cơ sở dữ liệu ngay khi nó được gọi. Có lẽ bạn nên thử một cách tiếp cận khác, tạo một đối tượng mới bằng cách sử dụng '.new' và chuyển các thuộc tính như params, hoặc bất cứ thứ gì. – MurifoX

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