簡體   English   中英

Rails模型外鍵驗證

[英]Rails model foreign key validation

我需要在我的一個模型中驗證外鍵引用的行的存在。 情況是這樣的:

Project.rb

class Project < ActiveRecord::Base
  has_one :project_category

  # -----------------------------------------------------------------
  # this does not work because the attribute is actually called 
  # 'category_id' instead of the rails expected 'project_category_id'
  # -----------------------------------------------------------------
  validates :project_category, presence: true
end

項目移轉

class CreateProjects < ActiveRecord::Migration
  def change
    create_table :projects do |t|

      # ----------------------------------------------
      # this is why the column is called 'category_id'
      # ---------------------------------------------- 
      t.references :category, references: :project_categories, null: false

      # all of my other fields here, unimportant
    end
    add_foreign_key :projects, :project_categories, column: :category_id
  end
end

我知道我可以編寫一個自定義的驗證方法來檢查:category_id存在於project_categories表中,但我更願意讓Rails處理驗證(如果可以的話),因此可以使代碼保持DRY。

編輯

ProjectCategory.rb

class ProjectCategory < ActiveRecord::Base
  belongs_to :project

  validates :name, presence: true, uniqueness: { case_sensitive: false }
end

ProjectCategory遷移

class CreateProjectCategories < ActiveRecord::Migration
  def change
    create_table :project_categories do |t|
      t.string :name, null: false
    end
  end
end

看來,您只需要在has_one聲明中添加foreign_key選項,即可指定您指定的自定義列名,即category_id而不是project_category_id 有關詳細信息,請參見has_one的選項

# app/modeles/project.rb

class Project < ActiveRecord::Base
  has_one :project_category, foreign_key: 'category_id'

  # -----------------------------------------------------------------
  # this does not work because the attribute is actually called 
  # 'category_id' instead of the rails expected 'project_category_id'
  # -----------------------------------------------------------------
  validates :project_category, presence: true
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM