9

Tôi đang sử dụng Ruby 2.2.1 và Rails 4.2 để tạo ứng dụng. Tại một trong những quan điểm của tôi, tôi đã nhận được thông báo sau:phương thức chưa xác định `bao gồm 'đối tượng đối tượng

N+1 Query detected Politician => [:account] Add to your finder: :includes => [:account]

N+1 Query method call stack

app/models/user.rb:19:in `account'

app/controllers/home_controller.rb:6:in `index'

Đây là hành động của tôi tại bộ điều khiển nhà:

@account = current_user.account 
@new_contacts = current_user.contacts.created_this_week.count 
@new_collabs = current_user.collaborators.created_this_week.count 

Và phần có liên quan của người sử dụng mô hình:

belongs_to :role, polymorphic: true, dependent: :destroy 
delegate :account, to: :role 
delegate :collaborators, to: :role 
delegate :contacts, to: :role 

tôi đã cố gắng làm như sau:

@account = current_user.account.includes(:contacts, :collaborators) 

Nhưng tôi chỉ nhận được lỗi:

undefined method `includes' for <Account:0x007fa7474e04a8> 

tôi đã làm một số nghiên cứu và những gì có vẻ như là bao gồm các công trình chỉ dành cho các mối quan hệ (mà không phải là trường hợp).

Viên đạn có đáng lo ngại không có gì? Tôi có thể làm gì với điểm dừng này là truy vấn N + 1?

Cảm ơn!

+0

nội dung nằm trong dòng số 19 là gì? chương plz –

+0

@R_O_R dòng 19 được 'đại biểu: tài khoản, để:: role' dòng 6 của home_controller là: ' @account = current_user.account' –

Trả lời

4

includes chỉ có thể được gọi vào ActiveRecord::Relation s hoặc ActiveRecord::Base lớp trẻ em, account có vẻ là một instace của một mô hình, do đó không đáp ứng với các phương pháp ActiveRecord::Relation như includes. Có vẻ như một kết quả dương tính giả từ bullet ngay sau khi bạn chỉ nhận được tài khoản từ current_user, mặc dù tôi không khuyên bạn nên delagations cho các hiệp hội, nó có thể dẫn đến N + 1 vấn đề trong tính năng này.


Thay delagate với hiệp hội AR:

Giả sử rằng Account là một ActiveRecord mô hình thường xuyên, bạn có thể sử dụng has_one vĩ mô (nhìn vào documentation để biết thêm chi tiết):

has_one :account, through: :role 

Nó rất ít khi bạn cần phải lặp qua người dùng:

# You can avoid `N + 1` 
User.includes(:account).limit(50).each { |u| puts u.name } 
+0

Vì vậy, những gì để bạn khuyên bạn nên để tránh các đoàn trong trường hợp này ? –

+0

Giả sử rằng 'Tài khoản' là một mô hình' ActiveRecord' thông thường, bạn có thể sử dụng macro 'has_one' (xem [tài liệu] (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i -has_one) để biết thêm chi tiết): 'has_one: tài khoản, thông qua:: vai trò ' –

+0

vai trò thực sự là một hiệp hội đa hình, vì vậy khi tôi làm ' has_one: tài khoản, thông qua:: vai trò' Tôi nhận được lỗi sau: 'Không thể có has_one: thông qua liên kết 'Tài khoản người dùng #' thông qua liên kết đa hình 'Vai trò người dùng #'.' Có lẽ tôi nên kết hợp với người được ủy quyền? –

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