0

我对这个问题进行了很多搜索并观看了很多教程(例如 railscast:嵌套模型表单),但恐怕这不是解决我问题的正确方法。

我想为理论收集数据。这个理论有许多问题需要用独特的卡片来回答。我总是想显示所有问题(在所有卡片上),但答案可能会有所不同,具体取决于每张卡片。因此,我需要捕获 question_id 和 card_id,但是深度嵌套和通过参数捕获 id 会很痛苦。有谁知道我的问题的更好解决方案?

这是我的模型:

理论.rb

class Theory < ActiveRecord::Base

has_many :cards
has_many :questions

卡片.rb

class Card < ActiveRecord::Base

belongs_to :theory
has_many :answers
has_many :questions  (Do I need this here - I always want to display all questions?)

问题.rb

class Question < ActiveRecord::Base

belongs_to :theory
has_many :answers

答案.rb

class Answer < ActiveRecord::Base

belongs_to :card
belongs_to :question

非常感谢您的帮助!

4

1 回答 1

0

模型之间的关系不应取决于它们在屏幕上的显示方式。它们应该由它们实际上如何相互关联来确定。

我不完全理解应该代表什么理论/卡片,所以我不能告诉你需要存在哪些关系,但我可以尝试一下:

在我看来,一张卡片似乎代表了与特定理论相关的单个人的答案?如果是这样,那么您不需要“has_many :questions”,因为该卡只有答案。此外,每个答案都链接到一个问题,因此您可以通过答案“获取”问题。如果您真的想要卡片的问题列表,您可以在卡片模型中添加“has_many :questions, :through=>:answers”。

如果在完成任何回答之前每张卡片都可以添加一组不同的问题,那么您将需要“has_many :questions”,但如果所有问题都在每张卡片上,那么您就不需要它。

更新以回应您的以下评论:

一种方法是通过在控制器中构建答案来将答案添加到卡片中:

@card = Card.find 2
@theory = Theory.find 1

@theory.questions.each do |question|
   @card.answers.build :question=>question 
end 

然后在你看来做这样的事情(这是 HAML):

 = form_for @card do |f|
   -@card.answers.each do |answer|
     =f.fields_for answer do |answer_form|
       =answer_form.hidden_field :question_id 
       %p=answer.question.full_question 
       %p=answer_form.text_field :input

这是使用嵌套表单属性,因此要使其与您的 Card 模型一起使用,您必须将其添加到其中:

class Card < ActiveRecord::Base
  ..
  accepts_nested_attributes_for :answers
  ..
end
于 2013-02-12T13:04:46.467 回答