[英]Rails optional belongs_to
我正在為庫存管理編寫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方式?
謝謝。
相關遷移:
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
只是rails 5的更新,如果你想要這種行為,你需要傳遞這個選項:
belongs_to :user, optional: true
在Rails 5中,每當我們定義belongs_to關聯時,都需要默認存在關聯的記錄。
更新
如果您仍希望默認使用舊行為,則可以將配置添加到application.rb文件中。
# /config/application.rb
config.active_record.belongs_to_required_by_default = false
注意: 使用此配置的Rails 5的早期版本存在一些問題 ,但目前已修復,在候選版本5.2.3上進行了測試。
您是否有需要用戶在場的驗證? 如果是這樣,刪除它。
Rails絕對支持開箱即用,檢查你的遷移,你是否在user_id
行中包含了一個約束,如:null => false
? 如果是這樣,把它拿出來!
編輯:或者@Rodrigo Dias說明,將其反轉為:null => true
。
另外,請檢查您是否對產品型號中的用戶關系沒有任何驗證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.