Rails: validate uniqueness of two columns (together)

后端 未结 3 739
自闭症患者
自闭症患者 2020-12-02 06:58

I have a Release model with medium and country columns (among others). There should not be releases that share identical

相关标签:
3条回答
  • 2020-12-02 07:40

    All the above answers are missing how to validate the uniqueness of multiple attributes in a model. The code below intends to tell how to use multiple attributes in a scope.

    validates :country, uniqueness: { scope: [:medium, :another_medium] }
    

    It validates uniqueness of country in all rows with values of medium and another_medium.

    Note: Don't forget to add an index on the above column, this insures fast retrieval and adds a DB level validation for unique records.

    Update: For adding an index while creating table

    t.index [:medium, :another_medium], unique: true
    
    0 讨论(0)
  • 2020-12-02 07:47

    You can pass a :scope parameter to your validator like this:

    validates_uniqueness_of :medium, scope: :country
    

    See the documentation for some more examples.

    0 讨论(0)
  • 2020-12-02 07:48

    You can use a uniqueness validation with the scope option.

    Also, you should add a unique index to the DB to prevent new records from passing the validations when checked at the same time before being written:

    class AddUniqueIndexToReleases < ActiveRecord::Migration
      def change
        add_index :releases, [:country, :medium], unique: true
      end
    end
    
    
    
    class Release < ActiveRecord::Base
      validates :country, uniqueness: { scope: :medium }
    end
    
    0 讨论(0)
提交回复
热议问题