如何访问属于2个模型的模型,所有3个模型嵌套在另一个模型下?

时间:2015-08-17 01:28:11

标签: ruby-on-rails matrix associations rails-models

我为决策矩阵建模,因此对于每个决策(其中n个),有x 替代可供选择,y 目标见面。 “替代”和“目标”的每个x * y对都与得分相关联。

其他文档(下面列出)解释了更简单的建模挑战,所以我仍然输了。如何为决策矩阵建模使用分数属性

以下是每个模型的代码片段和我尝试过的测试。

决定

$this->Session->setFlash()

替代

class Decision < ActiveRecord::Base
  has_many :alternatives, dependent: :destroy
  has_many :goals, dependent: :destroy
  has_many :scores, dependent: :destroy
  validates :name, presence: true, length: { maximum: 50 }
end

目标

class Alternative < ActiveRecord::Base
  belongs_to :decision
  has_many :scores, dependent: :destroy
  validates :decision_id, presence: true
  validates :name, presence: true, length: { maximum: 50 }
end

得分

class Goal < ActiveRecord::Base

  belongs_to :decision
  has_many :scores, dependent: :destroy
  validates :decision_id, presence: true
  validates :name, presence: true, length: { maximum: 50 }
  validates :constraint, inclusion: [true, false]
  validates :rank, numericality: {only_integer: true,
                                    greater_than_or_equal_to: 1},
                                    allow_blank: true
  validates :weight, numericality: {greater_than_or_equal_to: 0,
                                    less_than_or_equal_to: 1},
                                    allow_blank: true
end

我在decision_test.rb中尝试了以下测试,但在发现使用Score属性有多困难之前,该测试并不起作用。

class Score < ActiveRecord::Base
  belongs_to :decision
  belongs_to :goal
  belongs_to :alternative
  validates :decision_id, presence: true
  validates :goal_id, presence: true
  validates :alternative_id, presence: true
  validates :rating, numericality: {only_integer: true,
                                    greater_than_or_equal_to: -2,
                                    less_than_or_equal_to: 2},
                                    allow_blank: true
end

Schema.rb

test "associated decision data should be destroyed" do
    @decision.save
    @alternative_1 = @decision.alternatives.create!(name: "toaster")
    @goal_1 = @decision.goals.create!(name: "fast")
    @score_1 = @decision.scores.build(
                    params[:score].merge(:alternative_id => @alternative_1.id,
                                         :goal_id => @goal_1.id)) ## doesn't work
    assert_difference ['Alternative.count','Goal.count'], -1 do
        @decision.destroy
    end
  end

资源(最相关的资源):

2 个答案:

答案 0 :(得分:0)

这可能是解决这个问题的方法。

由于每个Decision有许多Alternatives(x)并且有许多Goals(y),并且这些只是X,Y配对,因此这些配对应存储为连接表。 Score是此连接表,因为它本质上代表AlternativeGoal类型的连接表,只有它还存储X,Y连接对的分数值。

要获得决定链接以获得分数,您只需在设置ID时手动创建关系。我的预感是铁路将在创建后看到这种关系。不理想(语法可能会关闭)但我认为这可能有效:

决定:

has_many :alternatives, dependent: :destroy
has_many :goals, dependent: :destroy
has_many :scores, dependent: :destroy, class: Score

替代:

has_many :goals, through: :scores

目标:

has_many :alternatives, through: :scores

分:

belongs_to :alternative
belongs_to :goal

然后你的执行将是:

@decision.save
@alternative_1 = @decision.alternatives.create!(name: "toaster")
@goal_1 = @decision.goals.create!(name: "fast")
@score_1 = Score.new(alternative_id: @alternative_1.id, goal_id: @goal_1.id, score: params[:score], decision_id: @decision.id)
@score_1.save

然后@ decision.scores应该有用。

答案 1 :(得分:0)

我倾向于同意smallphoto模型目前的功能不完全正常。通过调用其他相关模型很难创建其实例。我会建议你改进。

我认为scoresdecisionalternative之间的关系是以适当的方式建模的。

我建议你将goal模型与其他模型分开。 score类不应score其他模型。其他模型不应配置belong_to

has_many :scores中的scores表可以在您拥有的状态下使用。

然后,您可以在其他三个模型上创建schemar.rb函数,这将为您检索scores模型,例如:

score模型中的

Decisions
def scores Score.where(decision_id:self.id) end 模型中的

Alternatives
def scores Score.where(decision_id:self.decision.id,alternative_id:self.id) end 模型中的

Goals

这样,可以分开配置包含评分系统(def scores Score.where(decision_id:self.decision.id,goal_id:self.id) end )的矩阵。