1
私のRailsアプリケーションでは、User
とAccount
という2つのモデルがあります。Railsアプリケーションで一意のフィールドを確認する
User
は、多くの場合、Accounts
です。
Account
は、以下のスキームに示すように、name
フィールドを含みます。
name
フィールドがAccount
で一意であるが、データベース内で一意である必要はないことを確認するにはどうすればよいですか?たとえば、User1
はAccount
、名前はCash
、User2
は異なる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
....