2

ユーザーに子供がいるレールアプリがあります。したがって、:users と :children の 2 つのモデルがありました。

以前は 1 対多の関係 (has_many / belongs_to) を使用していましたが、関係に関する変数を格納できる多対多の関係に開放したいと考えました。そこで、関係を「has_many through」関係に変更しました。:relationships というテーブルを作成しました。ちょっとした注意点: ユーザーのforeign_keyを:parent_idにしたいです。設定方法は次のとおりです。

スキーマ:

create_table "relationships", :force => true do |t|
    t.integer  "child_id"
    t.integer  "parent_id"
    t.datetime "created_at"
.
.
.

create_table "users", :force => true do |t|
    t.string   "email",                                  :null => false
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.string   "first_name"
    t.string   "last_name"
.
.
.

create_table "children", :force => true do |t|
    t.string   "name",                :null => false
    t.integer  "parent_id",           :null => false
    t.datetime "created_at",          :null => false
.
.
.

クラス定義:

ユーザー.rb:

has_many :relationships, foreign_key: "parent_id"
has_many :children, :through => :relationships, foreign_key: "parent_id"

child.rb:

has_many :relationships, foreign_key: "child_id"
has_many :parents, :through => :relationships

関係.rb:

belongs_to :parent, class_name: "User", :foreign_key => :parent_id
belongs_to :child, class_name: "Child", :foreign_key => :child_id

特定のユーザーを選択して user.children を取得しようとすると、[] が返されます。新しい子を追加しようとしてもうまくいきません。親と子を定義できますが、保存しようとすると、2 つを関連付けることができません。親が表示されないため、エラーが発生します。

* ActiveRecord::StatementInvalid (PG::Error: エラー: 列 "parent_id" の null 値が not-null 制約に違反しています*

クラス定義を 1 対多の設定に戻すと、子に問題なくアクセスできます。何が問題なのかわかりません。どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

0

どのように関係を築いていますか?@user.children次のように関係を作成すると、指定された例で機能します。

@user.relationships.build(child_id: ...) 
于 2013-08-14T20:03:59.153 に答える
-1

子をネストされた属性として作成する場合は、子テーブルparent_idで null を使用できるようにする必要があります。

変化する

create_table "children", :force => true do |t|
  t.string   "name",                :null => false
  t.integer  "parent_id",           :null => false
  t.datetime "created_at",          :null => false
end

   create_table "children", :force => true do |t|
      t.string   "name",                :null => false
      t.integer  "parent_id"
      t.datetime "created_at",          :null => false
    end
于 2013-08-14T18:18:04.583 に答える