Rails自引用has_many通过:没有添加正确的记录

问题描述:

为此,我一整天都在为我的大脑破坏。我通过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

用了一对多,通过关系,你不应该惹的关系表创建记录或给他们分配的属性。只需在操作类上使用基本的操作符,让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