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
用了一对多,通过关系,你不应该惹的关系表创建记录或给他们分配的属性。只需在操作类上使用基本的操作符,让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负责幕后操作。
如果我选择将associate
和remove
方法放在那里,这将在splits_controller中同样适用。
编辑:这里的架构为aid_stations
相关部分:
create_table "aid_stations", force: :cascade do |t|
t.integer "event_id"
t.integer "split_id"
...
end
你在'pool_tournament_match_relationships'表中只有一个外键? – idej
我添加了架构。看起来像parent_id只有一个整数。 – okysabeni
除非您有'parent_id'字段和'pool_tournament_match_id'字段,否则您的多对一关系将不起作用。看下面的例子。 – moveson