如何重构简单的动态属性?

时间:2011-03-18 14:45:18

标签: ruby-on-rails syntax refactoring

我有一个表单可以处理同一表单的四种不同类型的构面。在我的SQL专栏中,我有四个不同的属性。

其中只有一个会有数据。

Distribution  =>
   zip_code: nil
   me_topic: nil
   sex: nil
   age: nil

为了区分它们,我想设置一个case语句,并在create call中添加 dynamic 属性:

@type = case params[:type]
  when "zip"      then ":zip_code"
  when "interest" then ":me_topic"
  when "sex"      then ":sex"
  when "age"      then ":age"
end
@cur_item = Distribution.new(@type => params[:value])

# Unfortunately, this is not the proper way to create a dynamic attribute


@distribution = @email.distributions.create(params[:distributions])  

完成此声明的正确语法是什么?

3 个答案:

答案 0 :(得分:1)

声明一个名为type_map

的方法
def type_map params
  @@type_map ||= {
    "zip"      => :zip_code, 
    "interest" => :me_topic, 
    "sex"      => :sex, 
    "age"      => :age
  }
  { @@type_map[params[:type]] => params[:value]
end

现在您可以按如下方式使用地图:

@distribution = @email.distributions.create(type_map(params)) 

答案 1 :(得分:0)

这就是我的目的,但我可以随心所欲地回答。

  @cur_item = case params[:type]
    when "zip"      then {:zip_code => params[:value]}
    when "interest" then {:me_topic => params[:value]}
    when "sex"      then {:sex => params[:value]}
    when "age"      then {:age => params[:value]}
  end

  @distribution = @email.distributions.create(@cur_item)  

答案 2 :(得分:0)

嗯,改善代码的一种方法(你在答案中发布的内容)是将重复的params[:value]分解为如下:

key = case params[:type]
  when "zip"      then :zip_code
  when "interest" then :me_topic 
  when "sex"      then :sex
  when "age"      then :age
end

@cur_item = { key => params[:value] }
@distribution = @email.distributions.create @cur_item