67

在庫管理用の Rails フロントエンドを書いています。ユーザーが製品を登録できるようにしたいので、次のようにしています。

class User < ActiveRecord::Base
  has_many :products
  # <snip>
end

class Product < ActiveRecord::Base
  belongs_to :user
  # <snip>
end

問題は、ユーザーが登録する前に製品が作成されることです。つまり、呼び出してto をProduct.create設定するだけでもまったく問題ありません。ただし、ご想像のとおり、Rails はそのままではこれをサポートしていません。user_idnil

> 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
4

3 に答える 3

274

Rails 5 のアップデートです。このような動作が必要な場合は、次のオプションを渡す必要があります。

belongs_to :user, optional: true

Rails 5 では、begs_to 関連付けを定義するたびに、関連付けられたレコードがデフォルトで存在する必要があります。

更新
デフォルトで古い動作を引き続き使用したい場合は、構成を application.rb ファイルに追加できます。

# /config/application.rb
config.active_record.belongs_to_required_by_default = false

注意: Rails 5 の初期リリースでは、この構成でいくつかの問題がありましたが、現在は修正されており、リリース候補5.2.3でテストされています。

于 2016-11-30T18:02:37.153 に答える
2

ユーザーの立ち会いを必要とする検証はありますか? もしそうなら、それを取り除きます。

于 2013-05-22T19:24:33.540 に答える