使用变量循环遍历column_names

时间:2011-11-09 17:22:14

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个模型方法,可以为问卷应用创建报告。表中的每一列代表一个不同的问题,每一行都是受访者。它使用column_names方法创建一个问题ID数组,然后添加相关的响应。

def self.import_answers(params)

@members = Member.where(:questionnaire_id => params[:questionnaire])
@columns = Report.column_names
@members.each do |member|
  @report = Report.find_by_membership_number(member.membership_number)
  @responses = Response.where(:member_id => member.id)
  @columns.each do |column|
    question = column.to_s.gsub("q", "").to_i
    @response = @responses.where(:question_id => question).first
    unless @response.nil?
      @report.column = @response.response_id
      @report.save
    end
  end
end

此方法在@ report.column行中断。

我认为这可能是因为column_names方法返回一个字符串数组,如此......

["q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"]

这意味着@ report.column行像

一样迭代
@report."q1"

而不是......

@report.q1

有效。

我可能错了!但无论哪种方式,我都在努力弄清楚如何让它发挥作用,任何帮助都会非常感激!

3 个答案:

答案 0 :(得分:1)

您可以使用send("#{atr}=")动态设置属性。在审核您的代码后,您可能最好使用update_attribute,因为它会在一次调用中执行setsave操作。

我还注意到你在模型之外有问题id提取逻辑。将它封装在Report模型中可能更好。

class Report < ActiveRecord::Base
  # extract the question id from the column
  def self.column_question_id(name)
    name[1..-1].to_i
  end
end

现在您的代码可以写成:

Report.column_names do |column|
  @response = @responses.find_by_question_id(Report.column_question_id(column))  
  @report.update_attribute(column, @response.response_id) if @response.present?
end

答案 1 :(得分:0)

@report.send(column.to_sym) = @response.response_id

答案 2 :(得分:0)

@report.send("#{column}=".to_sym, @response.response_id)

您可以获得更多信息here