Update_ tất cả trong đường ray là gì?

Nhìn bề ngoài, .update_all đang chạy một truy vấn SQL duy nhất đang cập nhật tất cả các nhận xét với user_id trên 11. Về mặt kỹ thuật, .where[user_id: 11] là truy vấn cuối cùng, nhưng nó không nên chạy truy vấn SQL chỉ cho các mối quan hệ của related_comments sao?

Tôi có một giải pháp thay thế mà tôi có thể thực hiện việc này, nhưng nó sẽ yêu cầu hai truy vấn SQL và có vẻ quá cồng kềnh hơn mức cần thiết

comment = Comment.find[params[:id]]
# same as above
related_comment_ids = comment.where[something: params[:something]
  .union[comment.where[something_else: params[:something_else]]]
  .where[user_id: comment.user_id].pluck[:id]
#=> [12, 14, 17, 18]

Comment.where[id: related_comment_ids].update_all[receive_notifications: true]
#=> SQL [5.7ms]  UPDATE "comments" SET "receive_notifications" = 't'
#=> WHERE "comments"."id" IN [18, 14, 17, 12] [sql_query]
#=> 4

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Trong một thời gian rất dài trong Rails, không thể kết hợp câu lệnh xóa với truy vấn GROUP_BY và HAVING. Có vẻ như đó là thứ lẽ ra phải được hỗ trợ ngay lập tức, nhưng tiếc là đã bị bỏ qua — cho đến tận bây giờ

Trước

Việc sử dụng GROUP_BY hoặc HAVING trong câu lệnh xóa đã bị bỏ qua. Hãy xem một ví dụ

Ở đây, một người dùng có nhiều phiếu bầu và chúng tôi đang cố gắng đếm những người dùng có ít hơn ba phiếu bầu

User.joins[:votes].group["users.id"].having["count[votes.id] < 3"].count
=> {2=>1, 1=>2}

Nếu chúng tôi thực hiện update_all với mệnh đề group

User.joins[:votes].group["users.id"].having["count[votes.id] < 3"].count
=> {2=>1, 1=>2}
0 thì ActiveRecord sẽ bỏ qua nó

User.joins[:votes].group["users.id"].having["count[votes.id] < 3"].update_all[consistent: true]

# actual

UPDATE "users" SET "consistent" = ? WHERE "users"."id" IN [
  SELECT "users"."id" FROM "users" INNER JOIN "votes" ON "votes"."user_id" = "users"."id"
]  [["consistent", "t"]]

# expected

UPDATE "users" SET "consistent" = ? WHERE "users"."id" IN [
  SELECT "users"."id" FROM "users" INNER JOIN "votes" ON "votes"."user_id" = "users"."id"
  GROUP BY users.id HAVING [count[votes.id]  Traceback [most recent call last]:
        1: from [irb]:10
ActiveRecord::ActiveRecordError [delete_all doesn't support group, having]

Sau đó

May mắn thay, Rails 7 cho phép các mệnh đề GROUP BY và HAVING với update_all và sử dụng các truy vấn lồng nhau khi thực hiện DELETE với mệnh đề GROUP BY và HAVING

Điều thú vị là MySQL không hỗ trợ sử dụng câu lệnh DELETE hoặc UPDATE kết hợp với GROUP_BY hoặc HAVING. Để phá vỡ điều này, PR sử dụng các truy vấn lồng nhau

Làm cách nào để cập nhật tất cả các bản ghi trong Rails?

Rails cung cấp phương thức tạo tích hợp để thêm nhiều bản ghi trong một dòng mã hoặc theo thuật ngữ kỹ thuật hơn là “tạo hàng loạt”. Để cập nhật, nếu chúng ta muốn cập nhật các thuộc tính có cùng giá trị cho tất cả các bản ghi có sẵn thì chúng ta có thể làm như vậy với phương thức update_all .

Update_all có kích hoạt gọi lại trong Rails không?

permalink #update_all[cập nhật] ⇒ Đối tượng . Nó không khởi tạo các mô hình có liên quan và nó không kích hoạt các lệnh gọi lại hoặc xác thực Bản ghi đang hoạt động .

Làm cách nào để tạo nhiều bản ghi trong Rails?

Dưới đây là tóm tắt nhanh về cách đăng nhiều bản ghi được nhúng trong một yêu cầu HTTP với một yêu cầu duy nhất. .
Cập nhật các thông số mạnh [hoặc khai báo một phương thức mới] trong bộ điều khiển để chấp nhận một Mảng dữ liệu
Cập nhật hành động của bộ điều khiển [hoặc khai báo một hành động mới] để tạo bản ghi bằng cách tạo hoặc tạo

Cảm ứng trong đường ray là gì?

In rail touch được dùng để cập nhật trường updated_at cho các đối tượng liên tục . Nhưng nếu chúng ta chuyển các thuộc tính khác làm đối số, thì nó cũng sẽ cập nhật các trường đó cùng với updated_at. Thậm chí, nó sẽ cập nhật các trường không phải ngày giờ nếu được chuyển thành đối số. Ví dụ sản phẩm. chạm[. giá] #giá là một số nguyên.

Chủ Đề