我应该使用类方法或实例方法,为什么?(Should I use class method or in

2019-07-30 14:50发布

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

   <%= check_box_tag(:default_company) %> 
   <%= label_tag(:default_company, "Set Company as Default") %>

从本质上讲,当我创建一个企业,如果他们选中该复选框,我需要它运行类似下面的代码:

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

写他们这样,我不认为要么是有利的。

Answer 1:

顾名思义,应该用于那些涉及用户(一个在该方法被调用。)所以,你能想到的设置默认公司为用户作为特定实例的逻辑/操作上的模型实例的方法上的实例方法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

或者,你可以考虑从其他角度的关系,把一个实例方法对Companycompany.set_as_default_for(user)



Answer 2:

我想实际上使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


Answer 3:

在我看来,我总是创建一个class method ,如果有问题的方法代表的信息/行为被实例化的所有对象,从不同中是通用instance methods ,我用的时候,我相信它更像实例化的具体行动对象有问题。

但是,这是我的观点的视图。



Answer 4:

有几件事情:你有没有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


文章来源: Should I use class method or instance method, and why?