4

我有两个模型:客户和发票。每个客户可以有很多张发票,每张发票只属于一个客户。如果客户被删除,与他相关的发票也应该被删除。

这一切都是通过以下代码完成的:

#### 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

Slightly updated answer; in Rails 4.2, you can make use of the new required option on singular associations.

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

Rails 4.2 also supports this on has_one associations:

has_one :foo, required: true

Here is the PR: https://github.com/rails/rails/pull/16056

于 2015-01-29T21:59:25.243 回答