2013-12-16 7 views
0

У меня есть опрос, который может участие Участники:has_many: через Обзор атрибутов

Survey has_many: Вопросы, которые has_many: Ответы

Участник должен иметь возможность добавить его Голосования каждому из ответов (значения являются [-1,0,1])

Один вопрос выглядит следующим образом:

Question 1 
- Answer1 -> Please vote -1/0/1 (Checkbox field) 
- Answer2 -> Please vote -1/0/1 (Checkbox field) 
- Answer3 -> Please vote -1/0/1 (Checkbox field) 
- Participant Comment    (Text Field) 
- Participant Average    (Rating Field) 

Как сохранить правильно голосование? Я хочу сохранить participant_id, answer_id AND voting_value.

ADDED для объяснения:

(Пользователь получит ответ)

User < ActiveRecord::Base 
    has_and_belongs_to_many :surveys 
    has_many :participants 
end 

Survey < ActiveRecord::Base 
    belongs_to :user 
    has_many :questions 
end 

Question < ActiveRecord::Base 
    belongs_to :survey 
    has_many :answers 
end 

Answers < ActiveRecord::Base 
    belongs_to :question 
    has_many :votings 
end 

Voting < ActiveRecord::Base 
    belongs_to :answer 
    belongs_to :participant 
    attr_accessible :value 
end 

Participant < ActiveRecord::Base 
    has_many :votings 
    belongs_to :user 
end 
+0

Пожалуйста, разместите свои модели с определениями отношений. – vee

+0

Модели этого человека могут пролить некоторый свет на ваш http://stackoverflow.com/questions/20612855/redirecting-to-new-page-with-already-existing-records-after-user-login-for-authe –

ответ

0

Я думаю, что ваши participant и user модели должны быть объединены в одну, потому что не participantuser? Я не понимаю, зачем нужна модель Participant.

Скажем, мы сливаемся User и Participant в только User, связь между User и Voting бы тогда:

User < ActiveRecord::Base 
    has_and_belongs_to_many :surveys 
    has_many :votings 
end 

Voting < ActiveRecord::Base 
    belongs_to :answer 
    belongs_to :user 
    attr_accessible :value 
end 

Теперь из первого блока кода:

Question 1 
- Answer1 -> Please vote -1/0/1 (Checkbox field) 
- Answer2 -> Please vote -1/0/1 (Checkbox field) 
- Answer3 -> Please vote -1/0/1 (Checkbox field) 
- Participant Comment    (Text Field) 
- Participant Average    (Rating Field) 

не голосует сделано по ответам пользователей? В таком случае нам нужно отношение user has_many :votings? Я думаю, что ассоциация высказалась бы User занимает много Surveys, Survey имеет много Questions, Question имеет много Answers и ответ имеет много Votings. Каждый из них может быть проверен. Поэтому для этого я не думаю, что прямая связь между User и Voting является решением.

Вслед обновляется User, Answer и Voting модели с обновлениями ассоциаций:

User < ActiveRecord::Base 
    has_and_belongs_to_many :surveys 
end 

Answer < ActiveRecord::Base 
    belongs_to :question 
    has_many :votings 
end 

Voting < ActiveRecord::Base 
    belongs_to :answer 
    attr_accessible :value 
end 

Наконец, несколько других незначительных опечаток, как Answers < ActiveRecord::Base где класс Answer не должен быть во множественном числе.

Вторая проблема: у вас есть Userhas_and_belongs_to_manySurveys.Вы определяете many to many отношения между User и Survey, так что вы должны определить то же самое в вашей Survey модели, а также:

Survey < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :questions 
end 

Со всеми этими обновлениями ваши модели наряду с отношениями будет выглядеть следующим образом (Примечание: Я также добавлена ​​accepts_nested_attributes_for в моделях, так что, когда ваша форма представляет вам не нужно вручную создавать каждый из связанных объектов):

User < ActiveRecord::Base 
    has_and_belongs_to_many :surveys 
end 

Survey < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :questions 

    accepts_nested_attributes_for :questions 
end 

Question < ActiveRecord::Base 
    belongs_to :survey 
    has_many :answers 

    accepts_nested_attributes_for :answers 
end 

Answers < ActiveRecord::Base 
    belongs_to :question 
    has_many :votings 

    accepts_nested_attributes_for :votings 
end 

Voting < ActiveRecord::Base 
    belongs_to :answer 
    attr_accessible :value  
end 

с выше модели relationshp вы могли бы построить свои SurveysController «ы new и create действие будет выглядеть примерно следующим образом:

# app/controllers/surveys_controller.rb 
class SurveysController < ApplicationController 

    def new 
    @survey = current_user.surveys.build do 
    @question = @survey.questions.build 
    @answer = @question.answers.build 

    # Build three different votings for answer with default value. 
    [-1, 0, 1].each do |voting_value| 
     @answer.votings.build(value: voting_value) 
    end 
    end 


    def create 
    @survey = current_user.surveys.build(params[:survey]) 
    @survey.save 
    # Of course you would check if save succeeded or failed and take action accordingly. 
    end 
end 

Кроме того, я бы рекомендовал вам заглянуть в has_many...through вместо has_and_belongs_to_many для определения many to many отношений.

+0

Спасибо для вашего великого объяснения и обмена мыслями. Я определенно могу частично реализовать некоторые из ваших «кусков» кода. По-моему, я должен использовать модель участника. В фоновом режиме есть еще одна логика (пользователи могут посещать опрос и раздавать случайные коды участникам, чтобы они могли анонимно посещать участников. У участников нет прав, и Пользователь должен заплатить и т. Д. Я думаю, что я не могу исключить участника , – Jan

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