2011-12-09 16 views
11

Nếu bạn sử dụng joins trong phạm vi AREL, kết quả sẽ trở thành chỉ đọc (tức là bạn không thể cập nhật bất kỳ bản ghi nào bạn nhận được trở lại). Nếu bạn không muốn kết quả là chỉ đọc, bạn chỉ cần chuỗi readonly(false) vào phạm vi, ví dụ:Tại sao phạm vi AREL trở thành chỉ đọc khi sử dụng kết nối?

User.joins(:orders).where(:orders => { :state => 'completed' }).readonly(false)

Nhưng tôi đoán rằng có một lý do tại sao tham gia-phạm vi theo mặc định là chỉ đọc. Lý do đằng sau việc đặt kết quả thành chỉ đọc là gì?

Trả lời

1

Câu hỏi thú vị. Tôi đã googling xung quanh ..... Với một truy vấn tham gia, bạn đang nhận được một bản ghi duy nhất với các thuộc tính bảng đơn đặt hàng người dùng +. Nếu bạn cố gắng cập nhật một trong các thuộc tính (nói "order_num") trong bảng thứ tự thay vì bảng Người dùng, câu lệnh cập nhật cho bảng Người dùng sẽ không thể tìm thấy order_num và sẽ bị lỗi. Vì vậy, các phạm vi tham gia chỉ đọc theo mặc định để ngăn điều đó xảy ra.

Tài liệu tham khảo: 1) http://blog.ethanvizitei.com/2009/05/joins-and-namedscopes-in-activerecord.html
2) Proper way to prevent ActiveRecord::ReadOnlyRecord?

+2

Theo như tôi thấy, 'truy vấn SELECT' chỉ trả lại cho người sử dụng thuộc tính - * không * thứ tự các thuộc tính, vì nó làm một' người dùng lựa chọn . * FROM ... '. Vì vậy, đối tượng ActiveRecord trả về không được chứa bất kỳ thuộc tính thứ tự nào theo như tôi có thể hiểu được –

+0

Tôi cũng thấy nó chỉ trả lại nội dung của mô hình gốc. Nó làm cho nó khó khăn để sử dụng tham gia trong một phạm vi mặc định. Tôi sử dụng các phép nối trong một phạm vi mặc định để lọc ra các bản ghi không hoạt động dựa trên hệ sinh thái mô hình phân cấp (ví dụ: nếu Order là "không hoạt động") thì order_lines sẽ không được trả về theo mặc định. Đặt hàng default_scope {where (active: true)}. – TJChambers

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