在庫管理用の Rails フロントエンドを書いています。ユーザーが製品を登録できるようにしたいので、次のようにしています。
class User < ActiveRecord::Base
has_many :products
# <snip>
end
と
class Product < ActiveRecord::Base
belongs_to :user
# <snip>
end
問題は、ユーザーが登録する前に製品が作成されることです。つまり、呼び出してto をProduct.create
設定するだけでもまったく問題ありません。ただし、ご想像のとおり、Rails はそのままではこれをサポートしていません。user_id
nil
> 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 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