我应该使用类方法还是实例方法,为什么?

在我的Rails应用程序中,创建业务时我有一个包含以下字段的表单:

  

基本上当我创建一个企业时,如果他们选中此框,我需要它来运行类似下面的代码:

 def set_default_company(company, user) exists = DefaultCompany.find(user.id) if exists exists.update_attributes(company: company) else DefaultCompany.create(company: company, user: user) end end 

在学习的过程中,我通常会在我的控制器中执行这些操作,但我正在尝试遵循最佳实践并使用胖模型,瘦的控制器,所以我想要使用这样的逻辑:

 def create @company = Company.new(params[:company]) if @company.save if params[:default_company] Company.set_default_company(@company.id, current_user.id,) end flash[:notice] = "Company was successfully created." redirect_to @company else redirect_to new_company_path end end 

这是我对是否使用类方法或实例方法,调用set_default_company感到困惑的地方。 他们似乎都会工作,我看不到其中任何一方的好处。

除了给我任何关于使用哪种方法的信息之外,如果有人可以向我展示一个简短的写作实现,作为一个类方法与实例方法,它可以让我更好地理解为什么。

这是我写它们的方式:

 def self.set_default_company(company, user) # Logic here end def set_default_company(company, user) # Logic here end 

以这种方式写它我也没有看到任何好处。

顾名思义,模型上的实例方法应该用于与用户的特定实例(调用该方法的实例)相关的逻辑/操作。因此,您可以考虑将用户的默认公司设置为User的实例方法。 类方法适用于不在模型的单个实例上运行的事物,或者您没有可用实例的情况。 例如,您可能有一个类方法来整理您的数据库,例如User.purge_expired_users ,这些方法不适用于单个用户对象。

例如

 class User def set_default_company(company) exists = DefaultCompany.find(self.id) if exists exists.update_attributes(company: company) else DefaultCompany.create(company: company, user: self) end end end 

然后你的控制器方法看起来像:

 def create @company = Company.new(params[:company]) if @company.save if params[:default_company] current_user.set_default_company @company end flash[:notice] = "Company was successfully created." redirect_to @company else redirect_to new_company_path end end 

或者,您可以从另一个角度考虑关系,并在Company上设置实例方法,例如company.set_as_default_for(user)

我实际上会使set_default_company成为User上的实例方法。 User拥有默认Company ; 为什么Company需要默认的用户?

 class User def set_default_company(company) exists = DefaultCompany.find(id) if exists exists.update_attributes(company: company) else DefaultCompany.create(company: company, user: self) end end end 

在我看来,我总是创建一个class method如果有问题的方法表示在实例化的所有对象中非常通用的信息/行为,不同于instance methods ,当我相信它更像是实例化的特定操作时有问题的对象。

但那是我的观点。

一些事情:DefaultCompany有一个单独的表吗? 这似乎应该是公司表上的布尔标志。

接下来,公司和用户之间是否存在关联? 如果是这样,似乎最好的方法就是这样做

在用户模型中

 def set_default_company(company) self.companies.each do |c| c.update_attributes(:default => false) end company.update_attributes(:default => true) end 

或者在公司模型中

 def set_as_default update_attributes(:default_company => true) end