我收到了任务:
向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
有没有人可以解释完整方法的作用?
谢谢,迈克尔。
答案 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/