0
我試圖設置Rails 5 has_many通過:三種模型上的關聯類型。目標是讓用戶可以填寫該編輯或創建所有三種模型(和關聯)。Rails 5 has_many通過:關聯爲中介模型創建2條記錄
項目是「中介」模式。
這裏是我的模型:
class Client < ApplicationRecord
has_many :projects
has_many :programmers, through: :projects
accepts_nested_attributes_for :projects, reject_if: :all_blank, allow_destroy: true
accepts_nested_attributes_for :programmers, reject_if: :all_blank, allow_destroy: true
end
class Project < ApplicationRecord
belongs_to :client, optional: true
belongs_to :programmer, optional: true
end
class Programmer < ApplicationRecord
has_many :projects
has_many :clients, through: :projects
end
Postgres的模式:
create_table "clients", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
end
create_table "programmers", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
end
create_table "projects", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
t.integer "client_id"
t.integer "programmer_id"
t.index ["client_id"], name: "index_projects_on_client_id", using: :btree
t.index ["programmer_id"], name: "index_projects_on_programmer_id", using: :btree
end
add_foreign_key "projects", "clients"
add_foreign_key "projects", "programmers"
客戶端控制器(只是新/創建& PARAM部分)
def new
@client = Client.new
@client.projects.build
@client.programmers.build
end
def create
@client = Client.new(client_params)
respond_to do |format|
if @client.save
format.html { redirect_to @client, notice: 'Client was successfully created.' }
format.json { render :show, status: :created, location: @client }
else
format.html { render :new }
format.json { render json: @client.errors, status: :unprocessable_entity }
end
end
end
private
def client_params
params.require(:client).permit(:id, :name, projects_attributes: [:id, :name], programmers_attributes: [:id, :name])
end
最後,形式:
<%= form_for(client) do |f| %>
<% if client.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(client.errors.count, "error") %> prohibited this client from being saved:</h2>
<ul>
<% client.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<label>Client name</label>
<%= f.text_field :name %>
<br />
<%= f.fields_for :projects do |projectfields| %>
<label>Project name</label>
<%= projectfields.text_field :name %>
<% end %>
<br />
<%= f.fields_for :programmers do |programmerfields| %>
<label>Programmer name</label>
<%= programmerfields.text_field :name %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
控制檯日誌:
Started POST "/clients" for ::1 at 2016-11-09 09:14:31 -0800
Processing by ClientsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"6QouF/zC+ivHAlbEvnhuBob80/AGt2QFmn0xa569+wJ8iWRmDOnz229OJq6PxaYRnzjNoDf8j71Jf2FpY3FMZw==", "client"=>{"name"=>"aaa", "projects_attributes"=>{"0"=>{"name"=>"bbb"}}, "programmers_attributes"=>{"0"=>{"name"=>"ccc"}}}, "commit"=>"Create Client"}
(0.2ms) BEGIN
SQL (0.5ms) INSERT INTO "clients" ("created_at", "updated_at", "name") VALUES ($1, $2, $3) RETURNING "id" [["created_at", 2016-11-09 17:14:31 UTC], ["updated_at", 2016-11-09 17:14:31 UTC], ["name", "aaa"]]
SQL (0.6ms) INSERT INTO "projects" ("created_at", "updated_at", "name", "client_id") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", 2016-11-09 17:14:31 UTC], ["updated_at", 2016-11-09 17:14:31 UTC], ["name", "bbb"], ["client_id", 1]]
SQL (0.4ms) INSERT INTO "programmers" ("created_at", "updated_at", "name") VALUES ($1, $2, $3) RETURNING "id" [["created_at", 2016-11-09 17:14:31 UTC], ["updated_at", 2016-11-09 17:14:31 UTC], ["name", "ccc"]]
SQL (0.4ms) INSERT INTO "projects" ("created_at", "updated_at", "client_id", "programmer_id") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", 2016-11-09 17:14:31 UTC], ["updated_at", 2016-11-09 17:14:31 UTC], ["client_id", 1], ["programmer_id", 1]]
(5.5ms) COMMIT
Redirected to http://localhost:3000/clients/1
Completed 302 Found in 19ms (ActiveRecord: 7.5ms)
所以基本上合作,爲所有三種模式創建條目,除非有看起來像這樣的項目創建2個DB條目:
我一直在盯着這太久,圖我一定是失去了明顯的東西。有任何想法嗎?謝謝您的幫助。
我覺得這是更接近 - 一堆大驚小怪的樣子的關鍵可能是窩fields_for項目內field_for程序員阻斷後? – PDD