Rails已经通过关系

时间:2013-06-19 15:32:24

标签: sql ruby-on-rails activerecord

我有三个表:问题,问题回答和回复。

问题

  • ID
  • 名称
  • 标签

Question_Choice

  • ID
  • Question_id
  • 标签

响应

  • ID
  • USER_ID
  • Question_id

鉴于回复,我希望看到问号标签和question_choice标签。得到回答或选择与问题相关是没有问题的,但得到与选择相关的回应证明是具有挑战性的,因为我需要说" value = value"。我尝试过建立:has_one, :through => :question关系,但我不确定如何表达" value = value"东西。我只需要使用原始sql吗?

2 个答案:

答案 0 :(得分:1)

我假设您不想更改表结构(这将是最简单的解决方案)。这是您当前表结构的解决方案:

应用/模型/ question.rb

class Question < ActiveRecord::Base
  has_many :question_choices
end

应用/模型/ question_choice.rb

class QuestionChoice < ActiveRecord::Base
  belongs_to :question
end

应用/模型/ response.rb

class Response < ActiveRecord::Base
  belongs_to :question
  belongs_to :question_choice, :primary_key => 'value', :foreign_key => 'value', :conditions => proc { "question_id = #{self.question_id}" }
end

Response.first.question_choice将为您提供第一个question_choice的{​​{1}}。

答案 1 :(得分:0)

我猜测问题有很多问题选择,而且回答只有一个“选定”问题选择。要对此进行建模,您还需要在响应和问题选择之间建立直接关联,例如

class Question < ActiveRecord::Base
  has_many :question_choices
end

class QuestionChoice < ActiveRecord::Base
  belongs_to :question
end

class Response < ActiveRecord::Base
  belongs_to :user
  belongs_to :question
  belongs_to :question_choice
end

这意味着您需要在question_choice_id表格中添加responses列。