簡體   English   中英

Rails可選belongs_to

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM