Как поставить условия для энергичной загрузки без Join? - PullRequest
3 голосов
/ 03 февраля 2012

Я знаю, что об этом уже спрашивали, но не могу понять, как это сделать. Я пытаюсь загрузить влияние на вопросы и ответы, но только текущие пользователи считают это проверкой, проголосовал ли пользователь за элемент .... Основным элементом является событие. Я хотел бы сделать это желательно без объединений. Мои модели выглядят так:

Event has many Questions
Question has many Answers

Event has many influences
Question has many influences
Answer has many influences

Что я пробовал:

event.questions.includes(:answers, :influences)

Но это получает все влияния, а не только current_users. Я также попытался определить, что влияет, но это, похоже, не работает ... и мне было очень трудно определить ассоциацию has_many 'users_influences', с помощью которой я мог бы использовать вместо влияний ..

Я бы хотел загрузить влияния пользователей, чтобы они были доступны, задавали вопросы и отвечали в загруженном виде ... пояснить, что таблица влияний немного похожа на позицию, соединяющую пользователя с этими другими различными лица .. это возможно без объединения?

1 Ответ

2 голосов
/ 03 февраля 2012

Обезьяна патч ActiveRecord::Base в configuration\initializers\monkey_patches.rb

class ActiveRecord::Base

  # Use thread local variables to store the context.
  def self.current_user=user
    Thread.current[:current_user]= user
  end

  def self.current_user
    Thread.current[:current_user]
  end

  def current_user
    ActiveRecord::Base.current_user
  end

end

Добавьте before_filter в application_controller.rb, чтобы установить текущего пользователя в контексте запроса.

class ApplicationController < ActionController::Base
  before_filter :init_app_request

  def init_app_request
    ActiveRecord::Base.current_user = current_user # set the current user
  end
end

Теперь измените вашу ассоциацию в Question модели. Добавьте новую ассоциацию с именем current_user_influences, которая будет фильтровать влияния на основе текущего пользователя.

class Question

  has_many :influences,

  # use single quotes for the `conditions` string to avoid interpolating
  # the string during class loading.

  has_many :current_user_influences, :class_name => "Influence",
             :conditions => '#{current_user_check}' 

  def current_user_check
    current_user ? "influences.user_id = #{current_user.id} " : ""
  end
end 

Теперь вы можете загружать current_user_influences:

questions =event.questions.includes(:answers, :current_user_influences)
# influences pertaining to the current user
questions.first.current_user_influences 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...