2012-07-07 41 views
7

Tôi đang tìm cách tạo truy vấn so sánh hai thuộc tính của cùng một bản ghi, mà không cần kéo bản ghi và so sánh sau truy vấn. Trường hợp cụ thể của tôi có khả năng sẽ có 10k hồ sơ, vì vậy việc lặp qua từng hồ sơ không phải là một lựa chọn.Rails truy vấn activerecord so sánh hai thuộc tính của cùng một bản ghi

Ví dụ: Tìm hồ sơ này bằng cách truy vấn .where updated_at == created_at

#<User id: 1, name: "xxx", created_at: "2012-07-01 12:00:00", updated_at: "2012-07-01 12:00:00"> 

Rails 3+, ActiveRecord, MySQL.

Cập nhật: Như commentor Matzi chỉ ra, sau đây là hợp lệ khi sử dụng SQLite, nhưng không mysql:

User.where("created_at == updated_at") 

Giải Quyết: sai lầm đơn giản, ruby ​​vs sql.

Sqlite thể sử dụng:

User.where("created_at == updated_at") 

nhưng MySQL yêu cầu:

User.where("created_at = updated_at") 
+0

vấn đề là gì? Bạn có thể sử dụng '.where' để làm điều này. – Matzi

+0

Đó là những gì tôi đã hy vọng, nhưng đã được tìm kiếm với các điều khoản sai. Bạn có nhớ cung cấp một ví dụ nhanh hoặc liên kết đến tài liệu có liên quan không? Cảm ơn trước – Joe

+1

Điều này sẽ hoạt động: 'Users.where (" created_at == updated_at ")' – Matzi

Trả lời

7

Nếu bạn muốn làm điều này một cách chung chung, bạn nên sử dụng Arel để thoát khỏi một thực hiện cơ sở dữ liệu cụ thể. Một cái gì đó như

users = User.arel_table 
User.where(users[:created_at].eq(users[:updated_at])) 

sẽ làm việc

+0

Xin lưu ý rằng Arel là một API riêng và mặc dù nó không thay đổi thường xuyên trong vài năm qua, không có gì đảm bảo rằng nó sẽ không phá vỡ giữa các phiên bản nhỏ của Rails. –

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