2016-11-08 66 views
0

爲此,我一整天都在爲我的大腦破壞。我通過pool_tournament_match的關係創建了一個has_many,因此每個比賽可以有很多其他比賽。我創建了一個名爲 pool_tournament_match_relationships的表格。Rails自引用has_many通過:沒有添加正確的記錄

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,另一個匹配id是2. 1將被輸入到關係表中。

這裏是從控制檯輸出:

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

注意parent_id輸入是1,其是m,而不是平方米的ID。

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

我感謝您的幫助!

編輯:添加架構的關係表: 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只有一個整數。 – okysabeni

+0

除非您有'parent_id'字段和'pool_tournament_match_id'字段,否則您的多對一關係將不起作用。看下面的例子。 – moveson

回答

0

用了一對多,通過關係,你不應該惹的關係表創建記錄或給他們分配的屬性。只需在操作類上使用基本的操作符,讓Rails找出你的關係。

你們班的名字很長,我的頭腦裏不太直,他們是如何工作的,所以我會從我的一個項目中說明一些。

# 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 

注意associate_split創建aid_station記錄和remove_split摧毀一個,但沒有在任何方法aid_stations提及。 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通過關聯,他們爲我工作。這一個不起作用,因爲我假設它是一個自引用。我不是通過連接表連接兩個實體。我通過連接表連接相同的實體,並且感到困惑。但感謝您的答案。 – okysabeni

+1

在這種情況下,我認爲你需要別名操作類,以便引用它自己。我不知道如何在參考表中沒有兩個外鍵字段的情況下工作。這種關係還存在什麼? – moveson

+0

你說得對。我對RDMS軟弱無力,不確定rails協會如何在這個層面真正起作用。我遵循這個railscast教程,它的工作原理。謝謝! – okysabeni

相關問題