在数据库中插入和删除关联数据

时间:2017-06-23 19:50:47

标签: ruby-on-rails database rails-activerecord

我还在学习Ruby on Rails和相关的东西,所以请用我有限的知识来解决。我开发了一个用于学习的小型轨道应用程序,它具有用户,习惯,目标和里程碑模型。因此,用户可以创造他们想要开发的习惯,也可以为习惯添加可实现的目标,以及实现这些目标的里程碑,从而帮助用户保持专注。

所有模型之间的关系如下:

users

  has_many :habits
  has_many :comments
  has_many :goals, through: :habits
  has_many :milestones, through: :goals


habits
  belongs_to :user

  has_many :goals_habits
  has_many :goals, through: :goals_habits
  has_many :milestones, through: :goals

goals

 has_many :goals_habits
 has_many :habits, through: :goals_habits
 has_many :users, through: :habits

 has_many :goals_milestones
 has_many :milestones, through: :goals_milestones

goals_habits

  belongs_to :goal
  belongs_to :habit

milestones

  has_many :goals_milestones
  has_many :goals, through: :goals_milestones
  has_many :habits, through: :goals
  has_many :users, through: :habits

goals_milestones

  belongs_to :goal
  belongs_to :milestone

创建习惯后,我还会给用户一个下拉菜单以选择目标。同样,在创建目标后,用户还可以从给定的下拉菜单中选择要添加到目标的里程碑。目标和里程碑已经被播种到数据库中并且具有以下值:

goals = ["Should develop this in 1 week.", "Should develop this in 2 weeks.", "Should develop this in 3 weeks.", "Should develop this in 4 weeks." ]

milestones = ["Day 1", "Day 2", "Day 3", "Day 4", "Day 5", "Day 6", "Day 7", "Day 8", "Day 9", "Day 10", "Day 11", "Day 12", "Day 13", "Day 14",
"Day 15", "Day 16", "Day 17", "Day 18", "Day 19", "Day 21", "Day 22", "Day 23", "Day 24", "Day 25", "Day 26", "Day 27",
"Day 28", "Day 29", "Day 30", "Day 31 - The final day" "Week 1", "Week 2", "Week 3", "Week 4"]

现在解释bug的最佳方法是通过示例。如果这篇文章太长,请原谅我。

假设数据库中有两个用户。 User AUser B。现在,User A创建习惯"Reading",然后添加目标"Should develop this in 1 week." User A,同时将"Day 13"里程碑添加到目标"Should develop this in 1 week."

所以,现在,如果user B将目标"Should develop this in 1 week."添加到他的习惯"Swimming",目标"Day 13"将自动分配给它,因为用户A将该里程碑分配给了他的目标。我不想要的。

如果其中一个人会破坏该目标的里程碑,那么同样的事情也会发生。它会从两种习惯中删除。

我希望数据库分别处理每个请求。我知道它正在发生,因为一旦里程碑附加到数据库中的目标,它将每次出现。但我不知道如何解决这个问题。

我试图将目标的里程碑分配给空阵列,而任何用户都会尝试创建新目标,但正如您可以预测的那样,对于可能具有该目标的所有习惯,它都会做同样的事情。

我认为,我需要在数据库中插入和删除相关记录的某些条件,但不确定是什么。真的很难找到解决方案,但无法解决这个问题。任何建议都受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

我认为您的问题与您的记录结构有关。关系,你需要简化它。

"目标"不能有多个用户,他们应该像

目标有许多里程碑,属于一种习惯(如果需要属于用户)。 所以,当你创造一个习惯"对于"用户",然后您为该特定习惯创建目标。 目标表应该类似于:

  • ID
  • habit_id,
  • USER_ID,
  • 目标(或描述目标的任何东西):字符串 目标有很多里程碑

里程碑表看起来像:

  • ID
  • goal_id,
  • COMPLETION_DATE:日期

如果您想将里程碑添加到目标之外的事物(比如直接习惯),您也可以考虑使用数据的条件。因为实际上你不需要创造更多的复杂性,你只会在目标中添加里程碑,这看起来甚至不合逻辑吗?

他们试图描述同样的事情,"在x周" (未来的日期)和里程碑"在x天"。所以这个习惯可能既有目标又有里程碑,但目标不应该有里程碑,除非你改变目标以反映类似"子任务"习惯本身。

当然,在本练习中,它可能不是很重要,但在清楚地思考如何使用数据以及如何将数据结合在一起对于正确设计数据库结构和降低复杂性至关重要