2009-09-26 33 views
22

Khi thực hiện tìm kiếm trong bản ghi hoạt động Tôi đang tìm bản ghi không có bit được lưu trữ được đặt thành true.điều kiện tìm kiếm activerecord - tìm kiếm null hoặc false

Một số bit được lưu trữ là null (không được lưu trữ) những người khác đã lưu trữ được đặt thành false.

Rõ ràng,

Project.all(:conditions => {:archived => false}) 

nhớ các dự án với các bit được lưu trữ với các giá trị null. Làm thế nào để tất cả các dự án không được lưu trữ được chọn với bản ghi hoạt động?

Trả lời

16

Hãy thử điều này (trong Rails 2):

Project.all(:conditions => ['archived IS NULL OR archived = ?', false]) 

Đây là một hạn chế của phiên bản cũ của Rails, như đã giải thích ở đây: https://rails.lighthouseapp.com/projects/8994/tickets/1181-ar-find-producing-null-when-it-should-be-is-null

+0

Ron - Tôi nhận được thông báo lỗi sau từ SQLite khi tôi làm như bạn đề xuất. SQLite3 :: SQLException: không có cột như vậy: FALSE: SELECT * FROM "review_phases" WHERE (đóng IS NULL HOẶC đóng = FALSE) GIỚI HẠN 20 OFFSET 0 Có thể nào SQLite chỉ xử lý các phép toán khác nhau làm cho nó không hoạt động? – metasoarous

0

@metasoarous

Hãy thử:

Project.all(:conditions => "archived IS NULL OR archived = 'F'") 
0

Nếu bạn muốn có cơ sở dữ liệu bất khả tri, bạn có thể làm điều này trong Rails 3:

Project.where("archived IS NULL OR archived = #{ActiveRecord::Base.connection.quoted_false}") 
+1

@ Câu trả lời của SeanLazer dưới đây hoạt động trong Rails 3.0.9 và trông sạch hơn một chút. – John

6

Cơ sở dữ liệu một cách thích hợp bất khả tri để làm điều này là:

Project.where("archived IS NULL OR archived = ?", false) 
+0

Cảm ơn! Hoạt động trên cả SQLite và Postgres. Và chỉ cần lưu ý, nếu bạn nghĩ rằng điều này không hoạt động, hãy kiểm tra kỹ xem các giá trị trong DB ** của bạn có phải là false và không phải là Null hay không. Có thể đã cứu tôi một chút nhầm lẫn. – John

74

Rails 4 (có thể sớm hơn) hỗ trợ:

Project.where(archived: [false, nil]) 

... đó là khá ngắn gọn.

+1

trình trong Rails 3.2.14 – Trip

+1

cũng phát hiện ra việc này (một chút off topic nhưng một cách khác để sử dụng null: Project.where (lưu trữ: VALID_VALUES + [nil]) như ... Project.where (liên kết: account.project_codes.map (&: id) + [nil]) – TJChambers

+1

Đây phải là câu trả lời được chấp nhận. –

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