我为决策矩阵建模,因此对于每个决策(其中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
资源(最相关的资源):
答案 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
模型目前的功能不完全正常。通过调用其他相关模型很难创建其实例。我会建议你改进。
我认为scores
,decision
和alternative
之间的关系是以适当的方式建模的。
我建议你将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
)的矩阵。