1 Câu hỏi: Giao dịch trên mạng do không có người nhận rõ ràng

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Theo các tài liệu, trong các mô hình Rails, các giao dịch được thực hiện trên một trong hai lớp giảm dần từ ActiveRecord::Base hoặc bất kỳ trường hợp nào của một lớp như vậy. Một số bài đăng trên blog về danh sách chủ đề thay thế sau:

  • ActiveRecord::Base.transaction do
  • User.transaction do
    Người dùng xuống từ ActiveRecord :: Base
  • @user.transaction do
    @user là một phiên bản của Người dùng
  • self.class.transaction do
    trong bất kỳ mô hình nào.rb trong đó bản thân là ví dụ: Người dùng
  • self.transaction do
    trong bất kỳ mô hình nào.rb trong đó bản thân là ví dụ: một phiên bản của Người dùng)

Tuy nhiên, tôi thiếu một biến thể khác trong danh sách này: Làm thế nào về transaction do trong model.rb?

class User < ApplicationRecord
  def foo
    transaction do
      # do stuff
    end
  end
end

Tôi có đúng không khi cho rằng self. không thực sự cần thiết vì trong phạm vi của phương thức cá thể mô hình, bản thân luôn luôn là ví dụ mô hình theo mặc định?

    
0
  1. Có, giả định của bạn là chính xác và nội tuyến với tùy chọn 5 được trình bày ngay trên đó.
    2019-05-08 15: 57: 05Z
  2. Các tài liệu không thực sự nêu nếu có sự khác biệt giữa model.transactionmodel.class.transaction. Có thể phương thức cá thể chỉ là proxy cho phương thức lớp.
    2019-05-08 16: 35: 42Z
  3. @ max Đó chính xác là phương thức cá thể là def transaction(options = {}, &block); self.class.transaction(options,&block); end Nguồn
    2019-05-08 17: 25: 07Z
1 Câu trả lời                              1                         

Trong Ruby, người nhận ẩn trong một phương thức cá thể luôn là ví dụ:

class Thing
  def foo
    inspect
  end
end
irb(main):026:0> Thing.new.foo
=> "#<Thing:0x007fde95955828>"
  

Tôi có quyền cho rằng, đó là bản thân. không thực sự cần thiết vì trong   phạm vi của một phương thức ví dụ mô hình, bản thân luôn là mô hình   theo mặc định?

Luôn có một người nhận ngầm (tự) trong ruby. Những gì nó phụ thuộc vào bối cảnh. Trong phương thức lớp, lớp của nó. Nó là "chính" (đối tượng toàn cục) nếu bạn không ở trong một lớp hoặc mô-đun.

class Foo
  inspect
end
# => "Foo"

def foo
  inspect
end
# => "main"

Bạn chỉ phải sử dụng rõ ràng self khi có nhu cầu phân tán (ví dụ như self.class). Nhưng có nhiều tình huống có thể giúp dễ đọc mã của bạn.

Tất cả các tùy chọn ở trên tương đối nhiều chức năng:

  • ActiveRecord::Base.transaction kết nối với DB cho môi trường đó từ database.yml hoặc ENV["DATABASE_URL"].
  • User.transaction hoặc class.transaction có thể được sử dụng nếu bạn muốn có các kết nối khác nhau cho mỗi lớp mô hình hoặc chỉ không thích gõ. Tất cả những gì nó thực sự làm là connection.transaction(options, &block).
  • Mức cá thể self.transaction hoặc @user.transaction chỉ ủy nhiệm cho phương thức lớp. Tất cả những gì nó thực sự làm là self.class.transaction(options,&block);
0
2019-05-08 17: 44: 59Z
nguồn đặt đây