Rails multiple join vào một phương thức

Tyler

New Member
#1
Mình có một người dùng trong ứng dụng của mình có thể có nhiều đánh giá, kế hoạch và tài liệu. Đã có một mối quan hệ trong cơ sở dữ liệu của mình. Mình muốn hiển thị tất cả những điều này trong một tab duy nhất mà không cần truy vấn cơ sở dữ liệu quá nhiều lần.

Mình đã cố gắng để làm một phương pháp để tất cả tham gia trong một table duy nhất nhưng không thành công. Lỗi trả về như sau: undefined method 'joins' for #<User:0x007fcec9e91368>
Mã:
def library
  self.joins(:materials, :assessments, :plans)
end
Mục tiêu cuối cùng của mình là chỉ sửa đổi trên tất cả các đối tượng được trả về từ kết nối để chúng có thể được hiển thị thay vì có ba biến khác nhau cần phải được truy vấn làm chậm thời gian load của mình. Ý tưởng để làm điều này là như thế nào?
Mã:
class User < ApplicationRecord
  has_many :materials, dependent: :destroy
  has_many :plans, dependent: :destroy
  has_many :assessments, dependent: :destroy
end

class Material < ApplicationRecord
  belongs_to :user
end

class Assessment < ApplicationRecord
  belongs_to :user
end

class Plan < ApplicationRecord
  belongs_to :user
end
 

Admin

Administrator
Thành viên BQT
#2
Nếu tất cả những gì bạn muốn làm là load liên kết trước, hãy sử dụng includes:
Mã:
class User < ApplicationRecord
  # ...

  scope :with_library, -> { includes(:materials, :assessments, :plans) }
end
Sử dụng nó như thế này:
Mã:
User.with_library.find(1)
User.where(:name => "Trenton").with_library
User.all.with_library
# etc.
Khi các liên kết được load trước, bạn có thể sử dụng phương thức library này để điền một mảng với tất cả các tài liệu, đánh giá và kế hoạch của một người dùng cụ thể:
Mã:
class User < ApplicationRecord
  # ...

  def library
    [materials, assessments, plans].map(&:to_a).flatten(1)
  end
end
Ví dụ về trường hợp sử dụng:
Mã:
users = User.all.with_library
users.first.library
# => [ ... ]
Thông tin thêm: https://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
 

Từ khóa phổ biến

You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an alternative browser.

Top