0

所以我有 3 个模型:订单、项目和用户。

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)。我想在包含 :user_id 的 Order 模型中创建一个新列。但这是不正确的,因为 Item 已经与用户关联了吗?是否有一种奇特的关系可以让我得到我需要的东西,而无需在数据库中添加额外的 user_id 字段?

我可以从技术上说:

User 
has_many :orders, :through => :items

Order
has_many :users, :through => :items

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

另外顺便说一句,我无法摆脱项目与用户的关联,因为在一段时间内创建了项目并且与订单无关。

4

1 回答 1

1

如果你同时保持这两种联想,从长远来看,你会给自己带来麻烦。我认为您最好现在正确设置并使用 rake 任务使旧数据符合您的新模式。

因此,User -> Order -> Item为前进做好准备,然后创建一个 rake 任务来更新您的数据库:

  1. 对于 item.order == nil # legacy 记录的所有项目
  2. 创建新订单
  3. 将新的 order.user_id 设置为 item.user_id 并保存
  4. 将 item.order_id 设置为新的 order.id 并保存
  5. 冲洗并重复

现在您的架构已正确设置,并且您的所有旧数据都已迁移到新格式。最重要的是,您不会拘泥于尝试遵守传统格式。

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

于 2013-03-21T13:33:44.887 回答