Tôi đang viết một lối vào Rails để quản lý khoảng không quảng cáo. Tôi muốn người dùng có thể đăng ký sản phẩm, vì vậy tôi có:Rails tùy chọn thuộc về
class User < ActiveRecord::Base
has_many :products
# <snip>
end
và
class Product < ActiveRecord::Base
belongs_to :user
# <snip>
end
Vấn đề là sản phẩm được tạo ra trước khi được đăng ký bởi một người dùng. Tức là, hoàn toàn có thể chấp nhận để gọi Product.create
và chỉ cần đặt số user_id
thành nil
. Như bạn có thể tưởng tượng, tuy nhiên, Rails không hỗ trợ này ra khỏi hộp:
> 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!'
Tôi đã nghĩ về một loạt các biện pháp khắc phục kludgey, hấp dẫn nhất trong số đó là phải có một NullUser
subclassing User
và sử dụng để tạo ra sản phẩm. Nhưng điều đó vẫn có vẻ như một hack. Rails Way với điều này là gì?
Cảm ơn.
Việc chuyển có liên quan:
class AddUseridToProducts < ActiveRecord::Migration
def change
add_column :products, :user_id, :integer
end
end
và sau:
class Changeuseridtobeoptionalforproducts < ActiveRecord::Migration
def change
change_column :products, :user_id, :integer, null: true
end
end
Vui lòng đăng tất cả các xác thực mà bạn có trên mô hình 'Sản phẩm'. –