我正在为库存管理编写 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