Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 试图避免将不必要的user_id字段添加到rails db模式中_Ruby On Rails_Relationships - Fatal编程技术网

Ruby on rails 试图避免将不必要的user_id字段添加到rails db模式中

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的新列。但这是否不正确,因为某个项目已经与某个用户关联?是否存在一种奇特的直通关系,可以在不向数据库中添

所以我有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的新列。但这是否不正确,因为某个项目已经与某个用户关联?是否存在一种奇特的直通关系,可以在不向数据库中添加额外用户id字段的情况下满足我的需要

我可以说:

User 
has_many :orders, :through => :items

Order
has_many :users, :through => :items
但这对我来说像是一种恶作剧。为了获得与订单关联的用户,我必须说order.users.first(订单有很多:项,但所有项都只有一个用户)


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

如果你保持这两种关联,从长远来看你会遇到麻烦。我认为您最好现在就正确设置,并使用rake任务将旧数据与新模式相一致

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

  • 对于item.order==nil#遗留记录的所有项目
  • 创建新订单
  • 将new order.user\u id设置为item.user\u id并保存
  • 将item.order\u id设置为新的order.id并保存
  • 冲洗并重复
  • 现在,您的模式设置正确,所有旧数据都已迁移到新格式。最重要的是,您不必拘泥于尝试遵守传统格式


    对不起,我今天生病了

    谢谢你的回复。唯一的问题是,我所说的不是没有订单的遗留数据。基本上,用户创建各种项目。所有这些物品都进入他们的购物车。此时,没有为这些项目创建订单。然后,一旦用户实际购买了一组商品,就可以创建订单。因此,我们不能设置如下内容:用户->订单->项目,因为组合中不必有订单。好的,谢谢您的澄清。:)我仍然认为您应该只使用一个工作流。比如说,向订单添加一个标志以确定其状态并将其用于购物车。当用户下订单时,将状态更改为订单。@RichardBrown是正确的。当用户第一次创建项目时,您应该同时创建相应的订单。然后你可以运行一个rake任务(比如每周)来删除不完整的订单。我想我可以这样做,但即使有了这个实现——在创建项目时,它们彼此独立。一旦下了订单,用户就可以选择哪些项目进入他们的订单。那么,您认为我应该首先为每个项目创建一个新订单吗?然后,一旦用户实际下了订单(通过选择多个项目进入一个订单),将所有这些项目关联到一个订单(让我们只说与第一个项目关联的订单),然后删除与其余项目关联的所有订单?