4

クライアントと請求書の2つのモデルがあります。すべてのクライアントは多くの請求書を持つことができ、すべての請求書は1つのクライアントにのみ属します。クライアントが削除された場合は、クライアントに関する請求書も削除する必要があります。

これはすべて、次のコードを介して行われます。

#### Invoice class
class Invoice < ActiveRecord::Base
  attr_accessible :amount, :body, :client_id, :filename, :subject

  validates :amount, :body, :client_id, :filename, :subject, :presence => true
  validates :client_id, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }

  belongs_to :client
end

#### Client class
class Client < ActiveRecord::Base
  attr_accessible :city, :country, :name, :street, :zip

  validates :city, :country, :name, :street, :zip, :presence => true
  validates :zip, :numericality => { :only_integer => true, :greater_than_or_equal_to => 10000, :less_than_or_equal_to => 99999 }

  has_many :invoices, dependent: :destroy
end

これは私がこれまでに作成したものですが、疑問に思っています。ユーザーが新しい請求書を作成するときに、クライアントテーブルのクライアントIDが実際に存在することを検証し、存在しない場合は、それに応じたエラーメッセージを表示するにはどうすればよいですか。

4

2 に答える 2

5

外部キー(FK)制約については、データベースで行うことをお勧めします。Rails自体にはそのための組み込みのサポートはありません。Ruby / Railsでの外部キーの存在を確認したい場合は、アプリケーションに不要な負荷がかかります。

ここにいくつかのリンクが役立つかもしれません:

Railsでは外部キー制約を使用する必要があります

Railsでの外部キー制約のサポート

Railsの移行に外部キー制約を追加する

于 2012-09-15T01:48:25.793 に答える
1

少し更新された回答。Rails 4.2では、required特異な関連付けで新しいオプションを利用できます。

class Invoice < ActiveRecord::Base
  belongs_to :client, required: true
end

Rails 4.2は、has_oneアソシエーションでもこれをサポートしています。

has_one :foo, required: true

PRは次のとおりです:https ://github.com/rails/rails/pull/16056

于 2015-01-29T21:59:25.243 に答える