适当的范围放置

Proper Scope placement

我有一个 facade class,它对其他模型执行 SQL 查询。我想使用作用域,但我对在哪里实现它们以及它们是否比仅使用普通方法更好有疑问。我也很关心良好的编程习惯。

首先,这是我的模型

class User < ActiveRecord::Base
  has_many :projects 

class Project < ActiveRecord::Base   
  belongs_to :User
  has_many :tasks, :inverse_of => :project

class Task < ActiveRecord::Base 
  belongs_to :project, :inverse_of => :tasks 
  has_many  :instances

class Instance < ActiveRecord::Base
  belongs_to :task 

外观 class:

def Function1(param)
    @var = @user.instances.where("...", param).order(:start_time).group_by { |x| x.method}
end         
def Function2
    @var = @user.instances.where("...").first
end 
def Function3 
    @var = @user.projects.distinct
end

1) 函数 1 和 2 应该在用户模型上,还是在实例中?

2) function3 应该在用户模型中还是在项目中?

3) 例如,我可以写一个关于项目的 'distinct' 范围,以及一个调用项目的 'User distinct projects' 范围吗?

1) 函数 1 和 2 应该在用户模型上,还是在实例中?

在实例中 - 您正在限制返回实例的范围

2) function3 应该在用户模型中还是在项目中?

项目 - 同上。用户仍然是用户,但你将限制返回哪些项目,因此它是一个项目范围

3) 例如,我可以写一个关于项目的 'distinct' 范围,以及一个调用项目的 'User distinct projects' 范围吗?

是的,如果你真的想,你可以两者都做 - 实际上,可能不值得做用户 distinct_projects 范围,除非你可能会在其他地方再次重用用户 distinct_projects 范围(例如在另一个范围内)。它不会为您节省任何输入 ;)