【发布时间】:2015-01-27 17:17:28
【问题描述】:
我已阅读此问题:has_and_belongs_to_many, avoiding dupes in the join table 但我无法解决我的问题;
我有一个班级TypeProduit,里面有很多ExtensionFichier:
class TypeProduit < ActiveRecord::Base
has_and_belongs_to_many :extension_fichiers
end
和:
class ExtensionFichier < ActiveRecord::Base
has_and_belongs_to_many :type_produits
end
他们是相关的,感谢
class LinkExtensionFichiers < ActiveRecord::Migration
def change
create_join_table :extension_fichiers, :type_produits
end
end
编辑:
这是[正确的]控制器:
class TypeProduitsController < ApplicationController
before_action :set_type_produit, only: [:show, :edit, :update, :destroy]
# GET /type_produits
# GET /type_produits.json
def index
@type_produits = TypeProduit.all
end
# GET /type_produits/1
# GET /type_produits/1.json
def show
end
# GET /type_produits/new
def new
@type_produit = TypeProduit.new
end
# GET /type_produits/1/edit
def edit
end
# POST /type_produits
# POST /type_produits.json
def create
@type_produit = TypeProduit.new(type_produit_params)
puts "------extension_fichier_params------"
puts extension_fichier_params
#@type_produit.extension_fichier_ids = extension_fichier_params
@type_produit.extension_fichiers << ExtensionFichier.find_by(:id => extension_fichier_params)
respond_to do |format|
if @type_produit.save
format.html { redirect_to @type_produit, notice: 'Type produit was successfully created.' }
format.json { render :show, status: :created, location: @type_produit }
else
format.html { render :new }
format.json { render json: @type_produit.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /type_produits/1
# PATCH/PUT /type_produits/1.json
def update
respond_to do |format|
if @type_produit.update(type_produit_params)
format.html { redirect_to @type_produit, notice: 'Type produit was successfully updated.' }
format.json { render :show, status: :ok, location: @type_produit }
else
format.html { render :edit }
format.json { render json: @type_produit.errors, status: :unprocessable_entity }
end
end
end
# DELETE /type_produits/1
# DELETE /type_produits/1.json
def destroy
@type_produit.destroy
respond_to do |format|
format.html { redirect_to type_produits_url, notice: 'Type produit was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_type_produit
@type_produit = TypeProduit.find(params[:id])
end
def extension_fichier_params
@type_produit.extension_fichier_ids
end
# Never trust parameters from the scary internet, only allow the white list through.
def type_produit_params
params.require(:type_produit).permit(:nom, :extension_fichier_ids => [])
end
end
这是 Rails 服务器输出:
Started POST "/type_produits" for 127.0.0.1 at 2015-01-27 17:55:15 +0100
Processing by TypeProduitsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"4LBhwTvGjXOq+3qzO+loGUV/oBCYjW66aVDeE1Zj/AM=", "type_produit"=>{"nom"=>"qsdfqsdf", "extension_fichier_ids"=>["1", "2", ""]}, "commit"=>"Create Type produit"}
ExtensionFichier Load (0.4ms) SELECT "extension_fichiers".* FROM "extension_fichiers" WHERE "extension_fichiers"."id" IN (1, 2)
------extension_fichier_params------
1
2
ExtensionFichier Load (0.2ms) SELECT "extension_fichiers".* FROM "extension_fichiers" WHERE "extension_fichiers"."id" IN (1, 2) LIMIT 1
(0.1ms) begin transaction
TypeProduit Exists (0.1ms) SELECT 1 AS one FROM "type_produits" WHERE "type_produits"."nom" = 'qsdfqsdf' LIMIT 1
SQL (0.4ms) INSERT INTO "type_produits" ("created_at", "nom", "updated_at") VALUES (?, ?, ?) [["created_at", "2015-01-27 16:55:15.923132"], ["nom", "qsdfqsdf"], ["updated_at", "2015-01-27 16:55:15.923132"]]
SQL (0.1ms) INSERT INTO "extension_fichiers_type_produits" ("extension_fichier_id", "type_produit_id") VALUES (?, ?) [["extension_fichier_id", 1], ["type_produit_id", 8]]
SQL (0.1ms) INSERT INTO "extension_fichiers_type_produits" ("extension_fichier_id", "type_produit_id") VALUES (?, ?) [["extension_fichier_id", 2], ["type_produit_id", 8]]
SQL (0.0ms) INSERT INTO "extension_fichiers_type_produits" ("extension_fichier_id", "type_produit_id") VALUES (?, ?) [["extension_fichier_id", 1], ["type_produit_id", 8]]
(0.5ms) commit transaction
为什么只有 2 个对象的 rails 会插入 3 个对象
【问题讨论】:
-
您正在显示用于创建
TypeProduit对象的模型和日志,但您的控制器是用于创建Produit对象的代码。要正确诊断此问题,我们需要查看TypeProduitsController -
@smathy 你是对的,愚蠢的复制/粘贴。现在已经修复了
-
您的代码看起来正确,您应该检查一下您的 extension_fichiers 表中 id 1 是否没有重复记录:
ExtensionFichier.find_by(:id => [1,2])不过这似乎不太可能。 -
@ThomasGuillory 在数据库中没有欺骗:/
标签: ruby-on-rails ruby