如何在has_many的中间模型中创建has_many关联:通过以最佳方式关联Rails

时间:2018-06-14 20:41:34

标签: ruby-on-rails postgresql activerecord

我想要的是有一个我可以创建内容的个人资料,每个内容可以有很多视频,很多图像等等。这就是为什么我将视频和图像视为不同的表格的原因。但我想知道某个视频是否属于特定的个人资料或内容,而无需编写复杂的查询。

我有以下模型,有has_many:通过关联

class Profile < ApplicationRecord
  has_many :contents
  has_many :videos, through: :contents
end

class Content < ApplicationRecord
  belongs_to :profile
  belongs_to :video
end

class Video < ApplicationRecord
  has_many :contents
  has_many :profiles, through: :contents
end

以及以下迁移

create_table :contents do |t|
  t.string :name
  t.text :description
  t.references :video, foreign_key: true
  t.references :profile, foreign_key: true
end

create_table :profiles do |t|
  t.integer :profile_type
  t.references :user, foreign_key: true
end

create_table :videos do |t|
  t.string :name
  t.string :file
  t.string :link
end

到目前为止,我的问题是我每个内容只能有一个视频。如何在内容(中间表)中存储许多视频,以保持has_many通过关联?

由于我想要有不同类型的内容,这意味着它们会是额外的表格,我想得到一些有助于我改进这种方法的想法

注意:我正在阅读此文档,http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

1 个答案:

答案 0 :(得分:0)

&#34;真相&#34;存在冲突

之间
  

我可以创建内容的配置文件,每个内容可以包含许多视频,许多图像等等

并且您的实际代码实现是:

  • 你说你想要的:
    • 个人资料有很多内容
    • 内容有很多视频
  • ...但您的代码是:
    • 个人资料有很多内容
    • 视频有很多内容

因此,如果我理解正确,并假设您想要更改您的&#34;代码&#34;进入你想要的&#34;然后:

TL; DR:

class Profile < ApplicationRecord
  has_many :contents
  has_many :videos, through: :contents
end

class Content < ApplicationRecord
  belongs_to :profile
  has_many :videos
end

class Video < ApplicationRecord
  belongs_to :content
end

,您的架构应如下所示:

create_table :contents do |t|
  t.string :name
  t.text :description
  t.references :profile, foreign_key: true
end

create_table :profiles do |t|
  t.integer :profile_type
  t.references :user, foreign_key: true
end

create_table :videos do |t|
  t.string :name
  t.string :file
  t.string :link
  t.references :content, foreign_key: true
end
  • 上面的代码应该回答您的其他问题:

      

    如何在内容中存储许多视频

    ...因为内容记录现在有很多视频