完成活动记录

时间:2015-11-01 18:55:49

标签: ruby-on-rails

我收到了任务:

向User模型类添加一个名为get completed count的方法,其中包括:

•接受用户作为参数

•使用聚合查询函数

确定用户已完成的TodoItem数量

- (提示:您正在寻找与特定用户关联的TodoItem的计数,其中已完成:true)

•返回计数

 class User < ActiveRecord::Base

     has_one :profile, dependent: :destroy
     has_many :todo_lists, dependent: :destroy
     has_many :todo_items, through: :todo_lists, source: :todo_items, dependent: :destroy
     validates :username, presence: true

     def get_completed_count
        todo_items.length
    end

  end

有没有人可以解释完整方法的作用?

谢谢,迈克尔。

5 个答案:

答案 0 :(得分:7)

所以你写了#34;接受用户作为参数&#34;所以你应该做到以下几点:

def self.get_completed_count(user)
  user.todo_items.where(completed: true).count
end

你可以称之为:

User.get_completed_count(user)

但上面的代码没有任何意义,因为更好的方法是将它作为实例方法:

def get_completed_count
  self.todo_items.where(completed: true).count
end

此代码将仅在实例上返回相同的结果。

你可以称之为:

User.find(id).get_completed_count

我假设TodoItem已经完成了一个布尔值(更好地创建一个范围并在方法中使用此范围而不是where(completed: true))。

答案 1 :(得分:0)

我的答案是:

def get_completed_count(user)
       user.todo_items.where(completed: true).count
end

感谢大家的回复。

答案 2 :(得分:0)

这实际上是我今天早上所做的,它对我来说非常有效

def get_completed_count 
       todo_items.where(completed: true).count
end

答案 3 :(得分:0)

以下代码对我有用。

def get_completed_count

self.todo_items.where(已完成:true).count

答案 4 :(得分:-1)

您需要ActiveRecordAssociation Extension

#app/model/user.rb
class User < ActiveRecord::Base
   has_many :todo_items, through: :todo_lists, source: :todo_items, dependent: :destroy do
      def completed
         where(completed: true).count
      end
   end
end

这将允许您致电:

@user = User.find params[:id]
@user.todo_items.completed #-> 5

要为Mantanco的回答提供上下文,您问题的直接答案是使用类方法。这是一个调用的方法,其类包含:

#app/models/user.rb
class User < ActiveRecord::Base
   def completed user
      user.todo_items.where(completed: true).count
   end
end

使用以下方法调用:

@user = User.find params[:id]
@user = User.completed user

您需要的是实例方法 - 一种适用于类实例的方法:

#app/models/user.rb
class User < ActiveRecord::Base
   def completed_items
      todo_items.where(completed: true).count
   end
end

这将允许您致电:

@user = User.find params[:id]
@user.completed_items

您将能够在此处看到类和实例方法之间的区别: http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/