2010-12-13 2 views
2

Я несколько нового для Ruby, и Rails, и я пытаюсь выяснить, как смоделировать следующую связь с использованием динамических свойств языка Ruby для ....Как моделировать отношения базы данных опросника с использованием динамических свойств

домен - это, по сути, вопросник, поэтому у меня есть пользователи, вопросы и ответы.

У пользователя есть идентификатор и имя. Ответ имеет свойство userid и questionid и значение value, которое является ответом пользователя на этот конкретный вопрос.

Каждый вопрос имеет уникальный «код», например, вопрос может быть «Какой ваш любимый цвет?», А код будет «fav_color».

Если у меня есть экземпляр пользователя, я хочу иметь возможность сделать: user.fav_color, чтобы получить/установить этот ответ.

Я полагаю, что я мог бы попробовать и пользователь method_missing, а затем сделать искатель вызова, как в этом примере: http://rpheath.com/posts/241-how-to-use-method-missing

Или я могу динамически добавлять свойства к классу во время выполнения, как здесь:

Ruby - dynamically add property to class (at runtime)

Но мне нужно читать/писать в базу данных .... просто хранение этих динамических свойств в переменной экземпляра не подходит для меня.

Любая помощь была бы оценена ... или советы на лучший способ подойти к этой проблеме :)

ответ

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 

Единственная проблема у меня с этим решением является то, что если я показывая пользователь всех ответов, есть отдельный запрос к базе данных для каждого вопроса. Я бы подумал: сбор ответов будет загружаться только один раз ...

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

Спасибо, что указали мне направление записи. Однако, как вы можете сказать из моего ответа, мне нужно «транспонировать» пользовательские атрибуты в таблицу ответов. Извините, если я не сделал это более ясным в своем вопросе. – Darragh

Смежные вопросы