我正在编写一个 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