2011-03-18 42 views
0

我有一个窗体可以处理同一窗体的四种不同类型的构面。在我的SQL专栏中,我有四个不同的属性。我如何重构一个简单的动态属性?

其中只有一个人将会有数据。

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

为了区分它们,我想成立一​​个case语句,和动态属性添加到创建呼叫:

@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]) 

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

回答

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)) 
+0

哇,我爱你的风格。听起来很棒! – Trip 2011-05-11 00:36:04

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) 
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