尽量避免将不必要的user_id字段添加到rails db schema中

时间:2013-03-21 13:22:02

标签: ruby-on-rails relationships

所以我有3个模型:Order,Item和User。

User
has_many :items

Order
has_many :items

Item
belongs_to :user
belongs_to :order

我的问题是:我还想关联User和Order模型(比如有一个关联:Order:belongs_to:user,User has_many:orders)。我想在Order模型中创建一个包含以下内容的新列:user_id。但这是不正确的,因为一个项目已经与用户有关联?是否有一种奇特的关系可以让我得到我需要的东西,而无需在数据库中添加额外的user_id字段?

我可以在技术上说:

User 
has_many :orders, :through => :items

Order
has_many :users, :through => :items

但这对我来说就像是黑客。为了让用户与订单相关联,我不得不说order.users.first(订单has_many:items,但所有商品只有一个用户)

另外顺便说一下,我无法摆脱Item与用户的关联,因为有一段时间创建了Item并且没有与Order关联。

1 个答案:

答案 0 :(得分:1)

如果你保持两种关联,你会长期陷入困境。我认为你最好现在正确设置并使用rake任务将旧数据与新模式相符合。

因此设置User -> Order -> Item以继续前进,然后创建一个rake任务来更新数据库:

  1. 对于item.order == nil#legacy record
  2. 的所有项目
  3. 创建新订单
  4. 将新订单.user_id设置为item.user_id并保存
  5. 将item.order_id设置为新的order.id并保存
  6. 冲洗并重复
  7. 现在您的架构已正确设置,并且所有旧版数据都已迁移到新格式。最重要的是,你不会试图遵守传统格式。

    对于伪代码抱歉,但我今天病了。 :)