Câu trả lời:
Trong Rails 4.x (Xem http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
Trong Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Để rút ngắn độ dài, bạn có thể lưu trữ GroupUser.arel_table
trong một biến hoặc nếu sử dụng bên trong mô hình GroupUser
, ví dụ: trong a scope
, bạn có thể sử dụng arel_table[:user_id]
thay vìGroupUser.arel_table[:user_id]
Cú pháp 4.0 tín dụng cho câu trả lời của @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Cách duy nhất bạn có thể có được nó fancier là với MetaWhere .
MetaWhere có một người anh em họ mới hơn được gọi là Squeel cho phép mã như thế này:
GroupUser.where{user_id != me}
Không cần phải nói, rằng nếu đây là công cụ tái cấu trúc duy nhất bạn sẽ thực hiện, thì không đáng để sử dụng đá quý và tôi sẽ chỉ gắn bó với những gì bạn có. Squeel rất hữu ích trong các tình huống khi bạn có nhiều truy vấn phức tạp tương tác với mã Ruby.
Đường ray 4:
Nếu bạn muốn sử dụng cả không bằng nhau và bằng nhau, bạn có thể sử dụng:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Nếu bạn muốn sử dụng nhiều loại toán tử (ví dụ. >
, <
), Tại một số điểm bạn có thể muốn chuyển các ký hiệu sau:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
Bạn phải luôn luôn bao gồm tên bảng trong truy vấn SQL khi xử lý các liên kết.
Thật vậy, nếu một bảng khác có user_id
cột và bạn tham gia cả hai bảng, bạn sẽ có một tên cột mơ hồ trong truy vấn SQL (nghĩa là rắc rối).
Vì vậy, trong ví dụ của bạn:
GroupUser.where("groups_users.user_id != ?", me)
Hoặc dài hơn một chút:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Lưu ý rằng nếu bạn đang sử dụng hàm băm, bạn không cần phải lo lắng về điều đó vì Rails chăm sóc nó cho bạn:
GroupUser.where(user: me)
Trong Rails 4, như đã nói bởi @ dr4k3, phương thức truy vấn not
đã được thêm vào:
GroupUser.where.not(user: me)