如何建模Decision,Choice和ChoiceSet关系?

时间:2017-05-13 21:01:10

标签: ruby-on-rails activerecord model has-many-through

我已经对这个数据建模问题感到头疼了几天,并决定向你们寻求帮助。虽然我已经与Rails合作了7年多,但这种关系建模正在逃避我。

我有一个Decision模型,它基本上由一个:question属性组成,例如:

  

今年哪支球队将赢得超级碗?

对于每个@decision,都有一组相应的@choices,例如:

  1. 达拉斯牛仔队
  2. 新英格兰爱国者队
  3. 纽约巨人队
  4. 绿湾包装工队
  5. 我想使用模型对这组@choices进行分组。我们称之为ChoiceSet

    所以用简单的英语总结一下所希望的关系:

      

    决策通过ChoiceSet有很多选择。

    到目前为止,这么好。在这里,我感到困惑。通常人们会这样建模:

    model Decision < ActiveRecord::Base
      has_many :choice_sets
      has_many :choices, through: :choice_sets
    end
    
    model Choice < ActiveRecord::Base
      has_many :choice_sets
      has_many :decisions, through: :choice_sets
    end
    
    model ChoiceSet < ActiveRecord::Base
      belongs_to :decision
      belongs_to :choice
    end
    

    这里需要注意的是:这是建模的方式,决定可以有多个选择集。我如何对此进行建模,以便决策只能设置一个选项?

    是否这么简单(只需将has_many :choice_sets更改为has_one :choice_set

    model Decision < ActiveRecord::Base
      has_one :choice_set
      has_many :choices, through: :choice_set
    end
    
    model Choice < ActiveRecord::Base
      has_many :choice_sets
      has_many :decisions, through: :choice_sets
    end
    
    model ChoiceSet < ActiveRecord::Base
      belongs_to :decision
      belongs_to :choice
    end
    

    感谢您的帮助。

    修改

    正如对此问题的回答所表明的那样,我应该指明我要避免说Choice :belongs_to Decision以便我不需要创建新的Choice记录除decision_id以外的所有内容时。例如,我不想为&#34; Dallas Cowboys&#34;提供2 Choice条记录。

1 个答案:

答案 0 :(得分:1)

好的,如果我们说多个决策可以有相同的选择集:

  

今年哪支球队将赢得超级碗?

  

今年哪支球队在超级碗中排名第二?

我们知道ChoiceSet和Decision

之间存在一对多的关系

每个ChoiceSet可以有很多选项,但你也说每个Choice都属于很多ChoiceSets ......这意味着你需要另一个连接表。这种关系就像......

model Decision < ActiveRecord::Base
  belongs_to :choice_set
  has_many :choices, through: :choice_set
end

model ChoiceSet < ActiveRecord::Base
  has_many :decisions
  has_many :choice_set_choice_links
  has_many :choices, through: :choice_set_choice_links
end

model ChoiceSetChoiceLink < ActiveRecord::Base
  belongs_to :choice_set
  belongs_to :choice

model Choice < ActiveRecord::Base
  has_many choice_set_choice_links
  has_many choice_sets, through: choice_set_choice_links
  has_many :decisions, through: :choice_sets
end

模型决策有choice_set_id ChoiceSetChoiceLink模型具有choice_set_idchoice_id