加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 我应该使用类方法还是实例方法,为什么?

发布时间:2020-12-17 04:34:05 所属栏目:百科 来源:网络整理
导读:在我的Rails应用程序中,创建业务时我有一个包含以下字段的表单: %= check_box_tag(:default_company) % %= label_tag(:default_company,"Set Company as Default") % 基本上当我创建一个企业时,如果他们选中此框,我需要它来运行类似下面的代码: def set_de
在我的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

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读