Piszę interfejs Railsowy do zarządzania zapasami. Chcę, aby użytkownicy mogli zarejestrować produktów, więc mam:Szyny opcjonalne belongs_to
class User < ActiveRecord::Base
has_many :products
# <snip>
end
i
class Product < ActiveRecord::Base
belongs_to :user
# <snip>
end
Problemem jest to, że produkty są tworzone przed zarejestrowanych przez użytkownika. Oznacza to, że można zadzwonić pod numer Product.create
i po prostu ustawić go na user_id
na nil
. Jak można sobie wyobrazić, choć Rails nie obsługuje tego z pudełka:
> 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!'
Myślałem o bandą kludgey obejścia, z których najbardziej atrakcyjne jest mieć NullUser
instacji User
i wykorzystanie do tworzenia produktów. Ale to wciąż wygląda na włamanie. Co to jest Rails Way?
Dzięki.
Odpowiedni migracja:
class AddUseridToProducts < ActiveRecord::Migration
def change
add_column :products, :user_id, :integer
end
end
i później:
class Changeuseridtobeoptionalforproducts < ActiveRecord::Migration
def change
change_column :products, :user_id, :integer, null: true
end
end
Poinformuj wszystkie weryfikacje, które masz na temat modelu "produktu". –