Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.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 如果不支持复合键,如何处理视图中的ID和多态关联?_Ruby On Rails_Database Design_Activerecord - Fatal编程技术网

Ruby on rails 如果不支持复合键,如何处理视图中的ID和多态关联?

Ruby on rails 如果不支持复合键,如何处理视图中的ID和多态关联?,ruby-on-rails,database-design,activerecord,Ruby On Rails,Database Design,Activerecord,我有一张电影计划表: movie_plans (id, description) 每个计划都有一些项目,这些项目描述了一系列电影和持续时间(以分钟为单位): movie_plan_items (id, movie_plan_id, movie_id, start_minutes, end_minutes) 该计划的一个具体实例发生在: movie_schedules (id, movie_plan_id, start_at) 但是,通过添加分钟数,可以根据电影计划项目和计划开始时间计算计划

我有一张电影计划表:

movie_plans (id, description)
每个计划都有一些项目,这些项目描述了一系列电影和持续时间(以分钟为单位):

movie_plan_items (id, movie_plan_id, movie_id, start_minutes, end_minutes)
该计划的一个具体实例发生在:

movie_schedules (id, movie_plan_id, start_at)
但是,通过添加分钟数,可以根据电影计划项目和计划开始时间计算计划项目

create view movie_schedule_items as
 select CONCAT(p.id, '-', s.id) as id,
   s.id as movie_schedule_id,
   p.id as movie_plan_item_id,
   p.movie_id, p.movie_plan_id,
   (s.start_at + INTERVAL p.start_minutes MINUTE) as start_at,
   (s.start_at + INTERVAL p.end_minutes MINUTE) as end_at
 from movie_plan_items p, movie_schedules s
 where s.movie_plan_id=p.movie_plan_id;
我在这个视图上有一个模型(只读),它工作正常,只是id现在是一个字符串

现在我想向前面的各种表中添加一个多态属性(如注释)。因此,对于movie_schedule_项目,我需要一个唯一且持久的数字id

我面临以下困境:

  • 我可以避免使用id,让movie\u schedule\u项只使用movie\u plan\u id和movie\u schedule\u id作为复合键,这是应该的。但Rails在这方面很差劲
  • 我可以使用String#hash或md5创建一个id,从而使它更慢或更容易发生冲突(并且IIRC String#hash在Ruby 1.9中不再在进程间持久)

关于如何处理这种情况,你有什么想法吗?

我认为你建立的模型有点太复杂了。 电影计划是一种模式,你用它来安排每天的电影日程?我非常建议删除MovieSchedule,而是允许用户复制现有的MoviePlan。这将a)使您的设计更简单,b)让用户有更多的自由,因为日程安排在现实中往往不同。周六有一场额外的日场,周三有一场特别的外国电影,这就是我在我最喜欢的电影院看到的一切


最后,对特定电影计划和时间表的电影发表评论对我来说没有任何意义,或者这是客户管理方面的事情,比如“晚上7点的搞笑电影秀我的座位脏了”

谢谢你的回答。实际上,我考虑过复制整个计划数据以及计划完成后的时间。是的,这是一种选择。忘掉座位上的评论吧。甚至电影只是一个说明核心问题的不真实的例子(视图上的ID,所以我可以有多态关联)。在这种情况下,最简单的方法是为MoviesScheduleItem创建一个模型,这也可以帮助您在性能需要时反规范化一些事情。这就是我现在正在做的。我不想这样做,因为该模型只是将计划的分钟偏移量添加到具体计划开始时间的结果,所以我复制了数据。