12

これらは私のモデルです:

class Product
  has_many :line_items
  has_many :orders, :through => :line_items
end

class LineItem 
  belongs_to :order
  belongs_to :product
end

class Order
    has_many :line_items
    has_many :products, :through => :line_items
end

schema.rb から:

  create_table "line_items", id: false, force: true do |t|
    t.integer  "order_id"
    t.integer  "product_id"
    t.integer  "quantity"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

Rails 4 にアップグレードしたところ、結合テーブルが機能しなくなりました。実行すると@order.line_items、「モデル LineItem のテーブル line_items の不明な主キー」という例外がスローされます。@order.products期待どおりに動作します。

line_items テーブルを削除して再作成しようとしました。また、protected_attributes gem をインストールしようとしましたが、何も変わりませんでした。

これがトレースです。

4

5 に答える 5

9

元のスキーマのは、テーブルにフィールドid: falseがないことを示しています。idRails 4 では、フィールドのないテーブルを作成し、名前に含まれる移行にこれを使用するcreate_join_tableヘルパー メソッドが追加されました。idJoinTable

Rails 3 よりも Rails 4 で異なる結果が得られると想像できる唯一の方法は、移行を再生成JoinTableし、名前に移行が含まれている場合です。Rails 3 のスキーマをまだ持っていますか? id: false結合テーブルにあることに注意してください。

primary_key については、主キーを配列に設定できたが、その後機能しなかった理由は、 https://github.com/rails/rails/primary_key=の 115 行ごとにメソッドがその引数をやみくもに文字列に変換するためです。ブロブ/a0dfd84440f28d2862b7eb7ea340ca28d98fb23f/activerecord/lib/active_record/attribute_methods/primary_key.rb#L115

https://stackoverflow.com/a/20016034/1008891とそのリンクも参照してください。

于 2013-11-16T07:54:59.943 に答える
4

を削除id: falseすると、エラーが修正されます。これを行うには、次の行で移行を行います。

add_column :model, :id, :primary_key

于 2018-03-10T10:37:26.743 に答える
3

受け入れられた回答はエラーメッセージを取り除きましたが、[:order_id、:product_id] が存在しないというエラーが表示されずに @order.line_items を保存できませんでした。

line_items テーブルを削除し、この移行で再作成することで、最終的にこれを解決しました。

  def change
    create_table :line_items do |t|
      t.references :order
      t.references :product
      t.integer :quantity
      t.timestamps
    end
  end

テーブルを最初に作成したときは「参照」を使用していませんでしたが、Rails 3 は気にしませんでしたが、Rails 4 は文句を言いました。

于 2013-07-16T14:23:38.940 に答える