Ruby on rails 试图避免将不必要的user_id字段添加到rails db模式中
所以我有3个模型:订单、商品和用户Ruby on rails 试图避免将不必要的user_id字段添加到rails db模式中,ruby-on-rails,relationships,Ruby On Rails,Relationships,所以我有3个模型:订单、商品和用户 User has_many :items Order has_many :items Item belongs_to :user belongs_to :order 我的问题是:我还想将用户和订单模型关联起来(比如有一个关联:Order:behings\u to:User,User有多个:orders)。我想在订单模型中创建一个包含:user\u id的新列。但这是否不正确,因为某个项目已经与某个用户关联?是否存在一种奇特的直通关系,可以在不向数据库中添
User
has_many :items
Order
has_many :items
Item
belongs_to :user
belongs_to :order
我的问题是:我还想将用户和订单模型关联起来(比如有一个关联:Order:behings\u to:User,User有多个:orders)。我想在订单模型中创建一个包含:user\u id的新列。但这是否不正确,因为某个项目已经与某个用户关联?是否存在一种奇特的直通关系,可以在不向数据库中添加额外用户id字段的情况下满足我的需要
我可以说:
User
has_many :orders, :through => :items
Order
has_many :users, :through => :items
但这对我来说像是一种恶作剧。为了获得与订单关联的用户,我必须说order.users.first(订单有很多:项,但所有项都只有一个用户)
另外,顺便说一句,我无法摆脱项目与用户的关联,因为有一段时间项目是创建的,并且与订单没有关联。如果你保持这两种关联,从长远来看你会遇到麻烦。我认为您最好现在就正确设置,并使用rake任务将旧数据与新模式相一致 因此,设置
User->Order->Item
以便继续,然后创建一个rake任务来更新数据库:
对不起,我今天生病了 谢谢你的回复。唯一的问题是,我所说的不是没有订单的遗留数据。基本上,用户创建各种项目。所有这些物品都进入他们的购物车。此时,没有为这些项目创建订单。然后,一旦用户实际购买了一组商品,就可以创建订单。因此,我们不能设置如下内容:用户->订单->项目,因为组合中不必有订单。好的,谢谢您的澄清。:)我仍然认为您应该只使用一个工作流。比如说,向订单添加一个标志以确定其状态并将其用于购物车。当用户下订单时,将状态更改为订单。@RichardBrown是正确的。当用户第一次创建项目时,您应该同时创建相应的订单。然后你可以运行一个rake任务(比如每周)来删除不完整的订单。我想我可以这样做,但即使有了这个实现——在创建项目时,它们彼此独立。一旦下了订单,用户就可以选择哪些项目进入他们的订单。那么,您认为我应该首先为每个项目创建一个新订单吗?然后,一旦用户实际下了订单(通过选择多个项目进入一个订单),将所有这些项目关联到一个订单(让我们只说与第一个项目关联的订单),然后删除与其余项目关联的所有订单?