Ruby on Rails - 使用 before_save 回调将函数应用于多个字段?

Kie*_*n E 1 ruby ruby-on-rails ruby-on-rails-4

请注意,这是一个示例,而不是我的实际用例。基本概念是我所追求的

(Ruby 版本 - 2.2.1,Rails 版本 - 4.2.4)

假设我的数据库中有emailfirst_name字段,我想使用 before_save 回调来小写。通常,我会这样做

before_save :downcase_function

...

private 

def downcase_function
  self.email = email.downcase
  self.first_name = first_name.downcase
end
Run Code Online (Sandbox Code Playgroud)

但是,这不是很灵活或可重用。如果我想将此函数添加到 last_name 字段怎么办?如果我需要跨多个模型怎么办?

我想做的是这样的事情

#pseudocode - does not work

before_save :downcase_function(:email, :first_name, :last_name)

...

private 

def downcase_function(fields)
  fields.each do |f|
    self.f = f.downcase
  end
end
Run Code Online (Sandbox Code Playgroud)

我知道这可能看起来很傻,但我没有运气。

以下是我所追求的关键事项:

  • 创建一个运行 before_save 的函数
  • 允许此函数接受参数
  • 将函数应用于指定我的参数的每个字段
  • (理想情况下)将它从任何一个模型中抽象出来,这样我就可以在任何模型中使用它,如果需要的话

非常感谢!

spi*_*ann 5

也许是这样的:

ATTRS_TO_DOWNCASE = %i( email first_name last_name ) 
before_save :downcase_attrs

private 
def downcase_attrs
  ATTRS_TO_DOWNCASE.each do |attr|
    write_attribute(attr, read_attribute(attr).downcase)
  end
end
Run Code Online (Sandbox Code Playgroud)