Ruby on rails Rails 5中的自引用关联

Ruby on rails Rails 5中的自引用关联,ruby-on-rails,activerecord,ruby-on-rails-5,Ruby On Rails,Activerecord,Ruby On Rails 5,我正在尝试在Rails 5中设置一个自引用关联。我有一个视频模型。视频可能有以前的视频(如电视连续剧)。理想情况下,它会这样做 irb(main):001:0> first_video = Video.create(url: 'https://youtu.be/W0lhlPdo0mw') irb(main):002:0> second_video = Video.create(url: 'https://youtu.be/gQhlw6F603o', previous_video:

我正在尝试在Rails 5中设置一个自引用关联。我有一个视频模型。视频可能有以前的视频(如电视连续剧)。理想情况下,它会这样做

irb(main):001:0> first_video  = Video.create(url: 'https://youtu.be/W0lhlPdo0mw')
irb(main):002:0> second_video = Video.create(url: 'https://youtu.be/gQhlw6F603o', previous_video: first_video)
irb(main):003:0> second_video.previous_video
=> #<Video id: 1, url: "https://youtu.be/W0lhlPdo0mw">
迁移

class CreateVideo < ActiveRecord::Migration[5.2]
  def change
    create_table :videos do |t|
      t.string :url, null: false
      t.references :previous_video, class: 'Video'

      t.timestamps
    end
  end
end
<代码>类CreateVideo 在Rails 5中实现这一点的最佳实践是什么?为什么上面的工作没有达到预期的效果?
干杯队

您需要如下设置关联:

has_one :prev_video, :class_name => 'Video', :foreign_key => 'previous_video'
已经设置好你可以呼叫的

@video.prev_video

外键是数据库列,我称之为prev_video的列可以根据您的意愿命名,只要您不使用与db列(previous_video)相同的名称。

t.references
用于
属于模型上的关联,而
在关联模型上有一个
。下面是我将如何编写模型和迁移来实现您想要的

更新(2019-05-31):

修复了迁移中的外键创建,因此它使用正确的to表。还添加了参考链接以获取更多信息

#模型
类视频<应用程序记录
属于(
#默认情况下,将使用关联名称+“\u id”作为列名
:下一段视频,
可选:true,
class_name:'Video',#将使用指定模型的表
逆\u的::上一个\u视频
)
你有吗(
:上一段视频,
class_name:'Video',#将使用指定模型的表
外键:“下一个视频id”,
倒数:下一个视频
)
结束
#迁移
类CreateVideo
  • t.references
  • (由
    t.references
    使用)

错误的原因是t.references将在数据库中创建一个
以前的\u video\u id
,而不是
video\u id
。如果您查看架构文件,您应该能够看到这一点。不
next\u video
将在此处查找名为
next\u videos
的表,因为它不存在。。。它将抛出一个错误?我更新了答案以修复外键创建。
@video.prev_video