适当的范围放置
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
范围(例如在另一个范围内)。它不会为您节省任何输入 ;)
我有一个 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
范围(例如在另一个范围内)。它不会为您节省任何输入 ;)