Ruby on Rails 3 范围扩展和包含



我正在试验范围扩展,想知道我是否可以做这样的事情。

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方法?

干杯

提姆

我认为您需要将包含语句移动到您的 lambda 中

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

将此关联添加到您的 Klass 中怎么样:

class Klass < ActiveRecord::Base
  has_many :users
  has_many :tasks, :through => :users
end

然后获取当前任务报告将如下所示:

Klass.find(6899).tasks

我假设 Rails 足够聪明,可以在结果查询中自动执行"IN"语句。

相关内容

  • 没有找到相关文章