在 ActiveRecord::Relation 中,是在模型中按父级范围还是在控制器中设置 @parent 更可取
in ActiveRecord::Relation, is it preferable to scope by parent in the model or set @parent in the controller
我有一个 class 属于另一个。
course.rb
class Course < ActiveRecord::Base
belongs_to :school
我目前使用 before_action 在控制器中设置父实例。
courses_controller.rb
class CoursesController < ApplicationController
#returns @school. only: [methods] avoids trying to set @school when no school param expected
before_action :set_school, only: [:index]
def index
@courses = if @school.nil?
Course.where(user_id: current_user.id)
else
Course.where(user_id: current_user.id, school_id: @school.id)
end
end
private
def set_school
if params[:school_id]
@school = School.find params[:school_id]
end
end
...但是我在模型中看到了 scope 方法,想知道在模型中简单地设置一个默认范围 :school 是否更合适,而在我极少数情况下设置 unscope/rescope想按用户而不是学校索引。
完全披露:我只注意到在使用 acts_as_list gem 的示例中有一个模型由父级限定,我不打算使用它,但似乎 Rails 会允许的。
这可能并且更合适吗?我开始支持瘦模型方法,但它只有一行与 6 行(在控制器中)。
不确定是否可行,但它会将您的大部分应用程序耦合到 default_scope
实现,恕我直言,这是一个非常糟糕的主意。您可能最终需要更改此实现,这将产生相当大的影响。它还会使您的单元测试更加复杂。
更多的代码行不一定是坏事,只要它能帮助您保持良好的关注点分离。
我有一个 class 属于另一个。
course.rb
class Course < ActiveRecord::Base
belongs_to :school
我目前使用 before_action 在控制器中设置父实例。
courses_controller.rb
class CoursesController < ApplicationController
#returns @school. only: [methods] avoids trying to set @school when no school param expected
before_action :set_school, only: [:index]
def index
@courses = if @school.nil?
Course.where(user_id: current_user.id)
else
Course.where(user_id: current_user.id, school_id: @school.id)
end
end
private
def set_school
if params[:school_id]
@school = School.find params[:school_id]
end
end
...但是我在模型中看到了 scope 方法,想知道在模型中简单地设置一个默认范围 :school 是否更合适,而在我极少数情况下设置 unscope/rescope想按用户而不是学校索引。
完全披露:我只注意到在使用 acts_as_list gem 的示例中有一个模型由父级限定,我不打算使用它,但似乎 Rails 会允许的。
这可能并且更合适吗?我开始支持瘦模型方法,但它只有一行与 6 行(在控制器中)。
不确定是否可行,但它会将您的大部分应用程序耦合到 default_scope
实现,恕我直言,这是一个非常糟糕的主意。您可能最终需要更改此实现,这将产生相当大的影响。它还会使您的单元测试更加复杂。
更多的代码行不一定是坏事,只要它能帮助您保持良好的关注点分离。