9

Bir uygulama oluşturmak için Ruby 2.2.1 ve Rails 4.2 kullanıyorum.undefined method `object örneği için

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

Ve kullanıcı modelinin ilgili bölümü::

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

Ben İşte

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'

benim ev denetleyicisi de eylemdir: Benim Gösterim birinde, şu mesajı var Zaten aşağıdakilere çalıştı:

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

Ama sadece hatayı alıyorum:

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

biraz araştırma yaptım ve ne görünüyor ki (böyle değildir) yalnıztüm ilişkiler için çalışmalarını kapsamaktadır olduğunu.

Mermi hiçbir şey için endişeleniyor mu? Bunun için N + 1 sorgusu olmaktan vazgeçebilir miyim?

Teşekkürler!

+0

# 19 satırında ne var? , Hesap:: role' hat home_controller 6 geçerli: 'temsilci gösterisi plz –

+0

@R_O_R hattı 19 olduğu ' @account = current_user.account' –

cevap

4

includes sadece böylece includes gibi ActiveRecord::Relation yöntemlere yanıt vermeyen, account bir modelin bir instace gibi görünüyor, ActiveRecord::Relation s veya ActiveRecord::Base çocuk sınıflar üzerinde çağrılabilir. current_user hesabından sadece bullet numaralı telefondan yanlış bir pozitif gibi görünse de, derneklere delagasyon önerilmemesine rağmen, bu özellik N + 1 sorunlarına yol açabilir. AR derneği ile


değiştirilmesi delagate:

Account makro has_one kullanabilirsiniz düzenli ActiveRecord modeli olduğunu varsayarsak (ayrıntılı bilgi için documentation bakabilirsiniz):

has_one :account, through: :role 

Çok avuç zaman var Kullanıcılar arasında yineleme yapmanız gerekir:

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

Peki bu durumda heyetler önlemek için tavsiye ? –

+0

"Hesap" ın normal bir ActiveRecord modeli olduğu varsayılarak 'has_one' makrosunu kullanabilirsiniz ([document] dosyasına bakın (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i -has_one): 'has_one: yoluyla hesap: yoluyla:: role ' –

+0

rol aslında bir polimorfik birliğidir, bu yüzden ' has_one: hesabını yaparken, aracılığıyla:: role' Şu hatayı alıyorum: ' bir has_one: 'Kullanıcı # rolü' polimorfik ilişkisinden geçen 'Kullanıcı # hesabı' aracılığıyla Belki de delege ile yapmalıyım? –

İlgili konular