2011-11-09 274 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