【发布时间】:2013-05-17 23:36:21
【问题描述】:
我正在为库存管理编写 Rails 前端。我希望用户能够注册产品,所以我有:
class User < ActiveRecord::Base
has_many :products
# <snip>
end
和
class Product < ActiveRecord::Base
belongs_to :user
# <snip>
end
问题在于产品是在用户注册之前创建的。也就是说,调用Product.create 并将user_id 设置为nil 是完全可以接受的。但是,正如您可以想象的那样,Rails 不支持开箱即用:
> Product.create!
(0.3ms) SELECT COUNT(*) FROM "products" WHERE "products"."type" IN ('Product')
(0.1ms) begin transaction
(0.1ms) rollback transaction
ActiveRecord::RecordInvalid: Validation failed: User can't be blank
from ~/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/validations.rb:56:in `save!'
我想了很多杂乱无章的变通办法,其中最吸引人的是拥有一个NullUser 子类化User 并使用它来创建产品。但这似乎仍然是一个黑客行为。这是什么 Rails 方式?
谢谢。
相关迁移:
class AddUseridToProducts < ActiveRecord::Migration
def change
add_column :products, :user_id, :integer
end
end
及以后:
class Changeuseridtobeoptionalforproducts < ActiveRecord::Migration
def change
change_column :products, :user_id, :integer, null: true
end
end
【问题讨论】:
-
请发布您对
Product模型的所有验证。
标签: ruby-on-rails ruby activerecord