2016-09-17 10 views
1

私のRailsアプリケーションでは、UserAccountという2つのモデルがあります。Railsアプリケーションで一意のフィールドを確認する

Userは、多くの場合、Accountsです。

Accountは、以下のスキームに示すように、nameフィールドを含みます。

nameフィールドがAccountで一意であるが、データベース内で一意である必要はないことを確認するにはどうすればよいですか?たとえば、User1Account、名前はCashUser2は異なるAccountですが、同じ名前はCashです。

user.rb:

class User < ActiveRecord::Base 
    has_many :accounts 

    before_save { self.email = email.downcase } 

    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

    validates :email, presence: true, 
        length: { maximum: 255 }, 
        format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 

    has_secure_password 

    validates :password, presence: true, length: { minimum: 6 } 

    # Returns the hash digest of the given string. 
    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
                BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 
end 

account.rb:

class Account < ActiveRecord::Base 
    belongs_to :user 
    has_many :balances 

    before_save { self.active = true } 

    validates :name, presence: true, length: { maximum: 250 }, 
        uniqueness: { case_sensitive: false } 

    validates :user, presence: true 
end 

schema.rb:あなたのに

.... 
    create_table "accounts", force: :cascade do |t| 
    t.string "name" 
    t.boolean "credit" 
    t.boolean "active",  default: true, null: false 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
    t.integer "user_id" 
    end 

    create_table "balances", force: :cascade do |t| 
    t.decimal "balance" 
    t.date  "date" 
    t.integer "account_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "users", force: :cascade do |t| 
    t.string "email" 
    t.boolean "admin" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.string "password_digest" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 
    .... 

答えて

2

あなたはscopeを使用することができます

validates :name, uniqueness: { scope: :user_id} 

4あなたが実際に検証します。

validates :name, presence: true, length: { maximum: 250 }, 
        uniqueness: { case_sensitive: false, scope: :use_id } 

active record validates

関連する問題