在Rails中设置两个模型之间的一对一和一对多关系

时间:2018-01-29 14:31:37

标签: ruby-on-rails ruby activerecord

所以,如果你有两个型号,那么就说Post和Tag,你想要一个'主'标签,以及许多'二级'标签,都来自Tag模型......这可能吗?我可以想象连接 - 你需要Post Model中的主标签ID列和Secondary标签的连接表......但是在Rails中有没有简单的方法呢?

谢谢!

2 个答案:

答案 0 :(得分:3)

在您的情况下,您需要一个联接表post_tags。此表具有主列,用于指示它是否为主标记。模型应如下所示:

class PostTag
  belongs_to :tags
  belongs_to :posts

  # it has primary with type is boolean
end

class Post
  has_many  :post_tags
  has_one   :primary_tag,   -> { where("post_tags.primary": true) }, through: :post_tags, class_name: "Tag"
  has_many  :secondary_tags, -> { where("post_tags.primary": false) }, through: :post_tags, class_name: "Tag"
end

class Tag
  has_many  :post_tags
  has_many  :posts, through: :post_tags
end

答案 1 :(得分:1)

这是我能想到的唯一方法,这很容易,has_many, through:是可选的,具体取决于你的需要。

class Post < ApplicationRecord
 has_one :tag
 has_many :secondary_tags
 has_many :tags, through: :secondary_tags
end

class Tag < ApplicationRecord
 belongs_to :post
 has_many :secondary_tags     
 has_many :posts, through: :secondary_tags
end

class SecondaryTags < ApplicationRecord
 belongs_to :post
 belongs_to :tag
end

像这样创建联合表:

class CreateSecondaryTags < ActiveRecord::Migration[5.0]
  def change
    create_table :secondary_tags do |t|
      t.integer :post_id
      t.integer :tag_id

      t.timestamps
    end
    add_index :secondary_tags, :post_id
    add_index :workout_categories, :tag_id
  end
end