2016-11-08 5 views
0

これで終日私の脳を破壊しました。 pool_tournament_matchのhas_manyリレーションシップを作成して、それぞれのマッチに他の多くのマッチがあるようにしました。私は pool_tournament_match_relationshipsというテーブルを作成しました。Rails自己参照has_many through:正しいレコードを追加していません

create_table :pool_tournament_match_relationships do |t| t.belongs_to :parent, class_name: 'PoolTournamentMatch', index: true t.timestamps end

pool_tournament_match.rb

has_many :pool_tournament_match_relationships, class_name: 'PoolTournamentMatchRelationship', foreign_key: :parent_id has_many :parents, through: :pool_tournament_match_relationships

だから、私はこれを行う際に、しかしmatch.pool_tournament_match_relationships.create(parent: anotherMatch)

ような何かを行うことができる必要があり、レコードが関係表に追加実際にはmatchの値であり、anotherMatchではありません。したがって、たとえば、一致IDが1でanotherMatch IDが2の場合は、1が関係テーブルに入力されます。ここ

コンソールから出力された:parent_idが入力した

m.pool_tournament_match_relationships.create(parent: m2)

INSERT INTO "pool_tournament_match_relationships" ("parent_id", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["parent_id", 1], ["created_at", 2016-11-08 21:51:29 UTC], ["updated_at", 2016-11-08 21:51:29 UTC]]

注意代わりM2のMのIDである1です。

irb(main):012:0> m.id => 1 irb(main):013:0> m2.id => 5

私はあなたの助けに感謝!

EDIT:関係テーブルのスキーマを追加します。 create_table "pool_tournament_match_relationships", force: :cascade do |t| t.integer "parent_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["parent_id"], name: "index_pool_tournament_match_relationships_on_parent_id", using: :btree end

+0

あなたはpool_tournament_match_relationships'テーブル 'で唯一の外部キーを持っていますか? – idej

+0

スキーマを追加しました。 parent_idには整数が1つしかないように見えます。 – okysabeni

+0

あなたが持っている多人数関係は、あなたが 'parent_id'フィールドと' pool_tournament_match_id'フィールドの両方を持っていなければ動作しません。以下の例を参照してください。 – moveson

答えて

0

あり、多くのスルーの関係を使用すると、関係テーブルのレコードを作成したり、それらに属性を割り当てると混乱する必要はありません。実際のクラスで基本的な演算子を使い、Railsにあなたの関係を把握させてください。

あなたのクラスの名前は長く、私は彼らの仕事の仕方がまったくまっすぐではないので、私は自分のプロジェクトのいくつかを例に説明します。 associate_splitがaid_stationレコードを作成し、remove_split、1つを破壊するが、方法のいずれかのaid_stationsの言及がないことを

# app/models/event.rb 

class Event < ActiveRecord::Base 
    has_many :aid_stations, dependent: :destroy 
    has_many :splits, through: :aid_stations 
... 
end 

# app/models/split.rb 

class Split < ActiveRecord::Base 
    has_many :aid_stations, dependent: :destroy 
    has_many :events, through: :aid_stations 
... 
end 

# app/models/aid_station.rb 

class AidStation < ActiveRecord::Base 
    belongs_to :event 
    belongs_to :split 
... 
end 

# app/controllers/events_controller.rb 

class EventsController < ApplicationController 
    before_action :set_event 
    ... 

    def associate_split 
    @event.splits << Split.find(params[:split_id]) 
    redirect_to splits_event_path(id: @event.id) 
    end 

    def remove_split 
    @event.splits.delete(params[:split_id]) 
    redirect_to splits_event_path(@event) 
    end 

    private 

    def set_event 
    @event = Event.find(params[:id]) 
    end 
end 

注意。 Railsはその背後でそれを処理します。

私がassociateremoveメソッドをそこに置くことを選択した場合、これはsplits_controllerでも同様に機能します。

編集:ここでは、スキーマの関連部分は、aid_stationsのためです:

create_table "aid_stations", force: :cascade do |t| 
    t.integer "event_id" 
    t.integer "split_id" 
    ... 
    end 
+0

私は団体を通じてhas_manyのカップルを持っていて、彼らは私のために働いています。私はそれが自己参照であると仮定しているため、これは動作しません。私は結合テーブルを介して2つのエンティティを接続していません。私は結合テーブルを介して同じエンティティを接続していると混乱している。しかし、答えをありがとう。 – okysabeni

+1

その場合、操作クラスを別名で参照する必要があると思います。参照テーブルに2つの外部キーフィールドがなければ、どのように動作するのかよく分かりません。関係は他にどのように存在するでしょうか? – moveson

+0

あなたは正しいです。私はRDMSに弱く、そのレベルでレール協会が実際にどのように機能するのかよくわかりません。私はこれをrailscastチュートリアルに従って、それは動作します。ありがとう! – okysabeni

関連する問題