我对Ruby和Rails有些新手,我正试图弄清楚如何使用Ruby的动态语言功能来建模以下关系....
域名本质上是一份调查问卷,因此我有用户,问题和答案。
用户有一个ID和一个名字。答案有一个用户ID和一个questionid和一个value属性,这是用户对该特定问题的回答。
每个问题都有一个独特的“代码”,例如,一个问题可能是“你最喜欢的颜色是什么?”,代码就是“fav_color”。
如果我有一个User实例,我希望能够:user.fav_color来获取/设置这个答案。
我想我可以尝试用户method_missing然后像这个例子那样进行查找器调用: http://rpheath.com/posts/241-how-to-use-method-missing
或者我可以在运行时动态地向类添加属性,如下所示:
Ruby - dynamically add property to class (at runtime)
但我需要读取/写入数据库....只是将这些动态属性存储在实例变量中对我没有好处。
任何帮助都会非常感激......或建议更好地解决这个问题:)
答案 0 :(得分:1)
code = "fav_color"
User.class_eval do
define_method code do
read_attribute code
end
define_method "#{code}=" do |value|
write_attribute code, value
end
end
答案 1 :(得分:0)
我已经对我的问题提出了以下答案......感谢上一张海报(iain)让我朝着正确的方向前进。
class User < ActiveRecord::Base
has_many :answers
Question.all.each do |q|
define_method q.code do
a = answers.find_by_question_id(q.id)
a && a.value || q.default_value
end
define_method "#{q.code}=" do |value|
a = answers.find_by_question_id(q.id) || answers.new({:question_id => q.id})
a.value = value
a.save
end
end
我对此解决方案的唯一问题是,如果我向用户显示所有答案,则每个问题都有一个单独的数据库查询。我原以为:答案集只能加载一次......