ruby on rails 3 расширения объема и включает в себя - PullRequest
0 голосов
/ 11 мая 2011

Я экспериментирую с расширениями области и мне было интересно, смогу ли я сделать что-то подобное.

class User  
  has_many :tasks
  belongs_to :klass      

  scope :users_in_klass, lambda {|k|  where(:klass_id => k)} do

    def current_task_report
      includes(:tasks)
      users = []
      each {|u|
        user = {
          :name => u.full_name,
          :id => u.id,
          :tasks => u.tasks
        }
        users << user
      }
      users
    end

end

И назови это так

u = User.users_in_klass(6899)
u.current_task_report

Проблема, с которой я столкнулся, заключается в том, что она игнорирует включения в задачах для активной загрузки.

User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE (`users`.`klass_id` = 6899)
Task Load (0.4ms)  SELECT `tasks`.* FROM `tasks` WHERE (`tasks`.user_id = 46539)
Task Load (0.2ms)  SELECT `tasks`.* FROM `tasks` WHERE (`tasks`.user_id = 46909)
Task Load (0.2ms)  SELECT `tasks`.* FROM `tasks` WHERE (`tasks`.user_id = 46910)

Что я делаю правильно?

Кстати, есть ли лучшее место для размещения метода current_task_report?

Приветствия

Тим

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Я думаю, вам нужно перенести оператор включения в вашу лямбду

class User  
  has_many :tasks
  belongs_to :klass      

  scope :users_in_klass, lambda {|k| includes(:tasks).where(:klass_id => k)} do

    def current_task_report
      users = []
      each {|u|
        user = {
          :name => u.full_name,
          :id => u.id,
          :tasks => u.tasks
        }
        users << user
      }
      users
    end

end
0 голосов
/ 11 мая 2011

Как насчет добавления этой ассоциации в ваш класс:

class Klass < ActiveRecord::Base

  has_many :users
  has_many :tasks, :through => :users

end

Тогда получение текущего отчета о задаче будет выглядеть примерно так:

Klass.find(6899).tasks

Я предполагаю, что Rails будет достаточно уменавтоматически выполнить оператор IN в результирующем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...