2011-11-09 195 views
0

我有一个模型方法,它为问卷应用程序创建一个报告。表中的每一列代表一个不同的问题,每一行都是一个受访者。它使用column_names方法创建一个问题ID数组,然后添加相关的响应。通过column_names循环遍历变量

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 

哪些工作。

我可能是错的!但无论哪种方式,我都在努力弄清楚我如何才能使其工作,任何帮助将不胜感激!

+0

你不显示其中'被定义@ report'。另外,你可以添加发生的确切的错误?仅仅报告它中断就太模棱两可了。你期待什么结果?你是否期待'@ report'会是一系列包含一系列问题和回答的受访者? – sorens

+0

报表为每个成员创建一行。 @report引用表中的一行(成员)。我已更新我的问题以显示完整的方法。 – tob88

回答

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

是的!这工作完美。虽然update_attribute拼写确实需要额外的T,但我不会认为这对你不利。谢谢,TICK! – tob88

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

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

你可以得到更多的信息here