Как я могу реорганизовать простой динамический атрибут? - PullRequest
0 голосов
/ 18 марта 2011

У меня есть форма, которая обрабатывает четыре разных типа фасетов одной формы. В моем столбце SQL у меня есть четыре различных атрибута.

Только у одного из них будут данные.

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

Чтобы различать их, я хотел создать оператор case и добавить атрибут dynamic в вызов create:

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

1 голос
/ 10 мая 2011

Объявите метод с именем 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 голосов
/ 10 мая 2011

Что ж, один из способов улучшить ваш код (то, что вы опубликовали в своем ответе) состоит в том, чтобы выделить повторяющиеся 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
0 голосов
/ 18 марта 2011

Это то, с чем я пошел, но не стесняйтесь, лучше ответьте.

  @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)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...