代码之家  ›  专栏  ›  技术社区  ›  Carl Edwards monkbroc

将对象限制为一个所有权ID

  •  1
  • Carl Edwards monkbroc  · 技术社区  · 9 年前

    我有一个 Flag 模型可能属于 Topic , Post Review 话虽如此 旗帜 模型具有所有三个对应的ID。

    class Flag < ActiveRecord::Base
      belongs_to :topic
      belongs_to :post
      belongs_to :review
    end
    
    class Topic < ActiveRecord::Base
      has_many :flags
    end
    
    class Post < ActiveRecord::Base
      has_many :flags
    end
    
    class Review < ActiveRecord::Base
      has_many :flags
    end
    

    当涉及到标记帖子时,比如说,我如何确保没有其他ID( topic_id , review_id )之后还能存在吗?我曾想过为这三种模式中的每一种创建特定的旗帜模型,但这条路线似乎过于重复。模型验证是我唯一明智的选择吗?如果是这样,它会是什么样子?更重要的是,我是否以正确的方式建立了这个协会?

    1 回复  |  直到 9 年前
        1
  •  3
  •   tompave    9 年前

    如何使用 polymorphic associations ?

    尝试使用:

    class Flag < ActiveRecord::Base
      belongs_to :flaggable, polymorphic: true
    end
    
    class Topic < ActiveRecord::Base
      has_many :flags, as: :flaggable
    end
    
    class Post < ActiveRecord::Base
      has_many :flags, as: :flaggable
    end
    
    class Review < ActiveRecord::Base
      has_many :flags, as: :flaggable
    end
    
    
    class UpdateAssociationsOnFlags < ActiveRecord::Migration
      def change
        remove_index  :flags, :topic_id
        remove_column :flags, :topic_id
    
        remove_index  :flags, :post_id
        remove_column :flags, :post_id
    
        remove_index  :flags, :review_id
        remove_column :flags, :review_id
    
    
        add_column :flags, :flaggable_id, :integer
        add_column :flags, :flaggable_type, :string
    
        add_index :flags, :flaggable_id
      end
    end
    

    编辑,回复问题作者的评论:

    您可以添加不同的关联:

    class Flag < ActiveRecord::Base
      belongs_to :flaggable, polymorphic: true
      belongs_to :reporter, class_name: 'User', foreign_key: :reporter_id
    end
    
    class User < ActiveRecord::Base
      has_many :reported_flags, class_name: 'Flag', foreign_key: :reporter_id
    end
    
    class AddUserForeignKeyToFlags < ActiveRecord::Migration
      def change
        add_column :flags, :reporter_id, :integer
        add_index :flags, :reporter_id
      end
    end