2010-12-27 36 views
15

Mã đầu tiên:Rails cơ sở dữ liệu giá trị boolean

create_table :users do |t| 
    ... 
    t.boolean :is_active, :default => true 
    ... 
end 

Bây giờ, đây là vấn đề của tôi - Tôi đang tạo ra một nhiệm vụ cào để nhập khẩu một số lượng lớn các hồ sơ (10.000). Tôi đã thực hiện thử nghiệm và đánh giá rộng rãi và xác định rằng cách nhanh nhất và hiệu quả nhất để thực hiện tác vụ này là tạo một câu lệnh SQL thô khổng lồ. (Tôi đang đọc dữ liệu từ CSV). Ví dụ:

inserts = Array.new 
FasterCSV.foreach(...) do |row| 
    inserts.push "(row[0], row[1]...)" 
end 
User.connection.execute "INSERT INTO users (...) VALUES #{inserts.join(", ")}" 

Mọi thứ đều tuyệt vời. Toàn bộ quá trình hoàn thành trong (nghĩa đen) giây thay vì 1,5 giờ sử dụng ActiveRecord. Tuy nhiên, vấn đề của tôi nằm ở trường boolean. Tôi phát triển cục bộ trên SQLite, nhưng MySQL về sản xuất. Khi sử dụng ActiveRecord, Rails xác định những gì cần đưa vào trường "boolean" (vì hầu như tất cả các cơ sở dữ liệu đều khác nhau). Tôi đang viết SQL tùy chỉnh và tôi muốn biết liệu có cách nào để tôi có thể làm điều gì đó như ...

INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...) 

... trả về chính xác giá trị boolean cụ thể cho cơ sở dữ liệu.

Bất kỳ ai trả lời "chỉ sử dụng ActiveRecord" sẽ bị bỏ phiếu. Nó chỉ đơn giản là không khả thi trong tình huống này. Tôi cũng không sẵn sàng sử dụng một trường nhỏ xíu (1) và sử dụng trường số 1 hoặc số 0.

Tóm lại, giá trị cho is_active cần phải thay đổi dựa trên các kết nối cơ sở dữ liệu hiện tại ...

Đây có phải là thậm chí có thể?

+0

Tại sao bạn không phát triển cục bộ bằng MySQL? Điều đó sẽ giải quyết vấn đề này, cùng với những điều không tương thích khác. Cách họ thường đối phó với boolean là sử dụng một tuyên bố chuẩn bị, nhưng sẽ không làm việc cho bạn. –

+0

Điều đó không trả lời câu hỏi của tôi. Nếu tôi muốn sử dụng POSTgres hoặc MSSQL tại một số thời điểm thì sao? – sethvargo

Trả lời

31

Tôi tin rằng bạn có thể tìm kiếm ActiveRecord::Base.connection.quoted_true

này trả về giá trị boolean mẹ đẻ trong dấu ngoặc kép, ví dụ '1' cho SQL Server hoặc MySQL và 't' cho PostgreSQL hoặc SQLite

+0

Cảm ơn bạn rất nhiều! Làm thế nào/nơi bạn đã tìm thấy điều này?! Ngoài ra, có thể đáng để chỉnh sửa câu trả lời của bạn (chỉ dành cho những người khác có thể gặp vấn đề này) để đề cập đến nó tự động bao gồm các dấu ngoặc kép ('). Ví dụ, nếu kết nối là sqlite, nó trả về 't' không chỉ t. – sethvargo

+2

Heh, để tìm nó, tôi đã có một số niềm vui tìm kiếm thông qua các mã cho adapter kết nối ActiveRecord. – Scott

+1

Chỉ cần cho rõ ràng: Bạn có thể sử dụng self.connection.quoted_ * trong các phương thức lớp và self.class.connection.quoted_ * trong các phương thức ví dụ. –

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