5

Я использую public_activity и один из моих частичного меня есть этот призыв:Как я могу загружать несколько ассоциаций?

<%= link_to "#{activity.trackable.user.name} " + "commented on " + "#{activity.trackable.node.name}", node_path(activity.trackable.node.family_tree_id,activity.trackable.node) %> 

Это выполняется этим вызов:

 <% @unread_act.each do |friend| %> 
     <li><%= render_activity friend %> </li> 
     <% end %> 

Эти переменная экземпляра назначенный в моем ApplicationController здесь:

before_filter :handle_nofications 

    def handle_nofications 
    if current_user.present? 
     @unread_act = Notification.where(owner_id: current_user).includes(:trackable => :user).unread_by(current_user) 
    end 
    end 

Я использую драгоценный камень Bullet, чтобы найти N + 1 запросов и обратную связь, которую я получаю, это:

N+1 Query detected 
    Comment => [:node] 
    Add to your finder: :include => [:node] 
N+1 Query method call stack 

Первоначально я получил это сообщение для :trackable и :user. Оба из которых я сейчас хочу загружать через includes в этот оператор присваивания.

Однако я понятия не имею, как пройти 3 уровня в глубину от нетерпенной загрузки - а не только двух.

Учитывая, что узел называется как activity.trackable.node.name, я представляю себе подходящее нетерпеливое задание загрузки будет выглядеть примерно так:

@unread_act = Notification.where(owner_id: current_user).includes(:trackable => [:user, :node]).unread_by(current_user) 

Но ошибка, я получаю это:

ActiveRecord::AssociationNotFoundError at/
Association named 'node' was not found on Node; perhaps you misspelled it? 

я даже получаю что когда я просто делаю:

@unread_act = Notification.where(owner_id: current_user).includes(:trackable => :node).unread_by(current_user) 

Так что я подозреваю что-то els e здесь происходит неправильно.

Любые идеи?

Edit 1

См Узел модели & уведомлений и ассоциации ниже.

Node.rb

class Node < ActiveRecord::Base 
    include PublicActivity::Model 
    tracked except: :update, owner: ->(controller, model) { controller && controller.current_user } 

    belongs_to :family_tree 
    belongs_to :user 
    belongs_to :media, polymorphic: true, dependent: :destroy 
    has_many :comments, dependent: :destroy 
    has_many :node_comments, dependent: :destroy 

Notification.rb

class Notification < PublicActivity::Activity 
    acts_as_readable :on => :created_at 
end 
+0

Показать ваши модели. Что такое 'отслеживаемая' ассоциация' Уведомление'? Что такое ассоциации «Узла»? –

+0

@MarekLipka обновленный вопрос. – marcamillion

ответ

0

кажется правильный способ приблизиться это с помощью массива по атрибуту trackable как так:

@unread_act = Notification.where(recipient_id: current_user).includes(:trackable => [:user, :node]).unread_by(current_user).order("created_at desc") 

Основная часть есть:

includes(:trackable => [:user, :node])

Это, кажется, сработало красиво.

1

Это, мы надеемся, будет закреплено в рельсах 5.0. Для этого уже существует проблема и запрос на перенос.

https://github.com/rails/rails/pull/17479

https://github.com/rails/rails/issues/8005

Я раздвоенный рельсы и применил патч к 4,2-стабильным и он прекрасно работает для меня. Не стесняйтесь использовать его, хотя я не могу гарантировать синхронизацию с восходящим потоком на регулярной основе.

https://github.com/ttosch/rails/tree/4-2-stable