我有一个模型方法,可以为问卷应用创建报告。表中的每一列代表一个不同的问题,每一行都是受访者。它使用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
有效。
我可能错了!但无论哪种方式,我都在努力弄清楚如何让它发挥作用,任何帮助都会非常感激!
答案 0 :(得分:1)
您可以使用send("#{atr}=")
动态设置属性。在审核您的代码后,您可能最好使用update_attribute
,因为它会在一次调用中执行set
和save
操作。
我还注意到你在模型之外有问题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。