【问题标题】:ruby on rails 3 scope extensions and includesruby on rails 3 范围扩展并包括
【发布时间】:2011-05-11 00:36:45
【问题描述】:

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

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

干杯,

提姆

【问题讨论】:

    标签: ruby ruby-on-rails-3 activerecord scope


    【解决方案1】:

    我认为您需要将包含语句移动到您的 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
    

    【讨论】:

      【解决方案2】:

      如何将此关联添加到您的 Klass:

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

      那么获取当前任务报告将如下所示:

      Klass.find(6899).tasks
      

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

      【讨论】:

      • 对不起,我的例子过于简化了,我把它简化了太多。我想做的不仅仅是完成任务。我想知道为什么 include(:tasks) 方法直到那时还没有运行,查询还没有运行。
      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2016-03-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多