Я пишу интерфейс 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!'
Я думал о связке kludgey обходов, наиболее привлекательным из которых является иметь NullUser
подклассов User
и использовать его для создания продуктов. Но это все еще кажется взломом. Что такое Rails Way с этим?
Благодарю.
Соответствующая миграция:
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