【问题标题】:Multiple refercences to same table RoR对同一个表 RoR 的多次引用
【发布时间】:2018-06-12 08:47:31
【问题描述】:

我有两个模型,User 和 Peticion。我希望Peticion 保存两个对两个不同用户的引用,也就是说,两个用户的ID。这是创建 Peticion 模型的迁移

class CreatePeticionExtras < ActiveRecord::Migration[5.1]
  def change
    create_table :peticion_extras do |t|
      t.references :user_solicitante, foreign_key: true
      t.references :user_solicitado, foreign_key: true
      t.timestamps
    end
  end
end

Peticion 的模型

class PeticionExtra < ActiveRecord::Base
  belongs_to :solicitante, class_name: "User"
  belongs_to :solicitado, class_name: "User"
end

和用户的模型

class User < ActiveRecord::Base
  has_many :solicitudes, class_name: "PeticionExtra", foreign_key: "user_solicitado_id", dependent: :destroy
  has_many :peticiones, class_name: "PeticionExtra", foreign_key: "user_solicitante_id", dependent: :destroy

问题是当我在控制器上调用 Peticion 的 create 时

def create
    peticion_extra = PeticionExtra.new(user_solicitante_id: params[:peticionextra][:user_solicitante_id], user_solicitado_id: params[:peticionextra][:user_solicitado_id])
respond_to do |format|
      if peticion_extra.save
        flash[:success] = "Petición enviada"
        format.html {redirect_to ejercicios_path and return}
        format.json {redirect_to ejercicios_url and return}
      else
        format.html {render action: "new"}
        format.json {render json: @user.errors, status: :unprocessable_entity}
      end
    end
  end

它抛出一个错误:“SQLite3::SQLException at /peticion_extra/crear 没有这样的表:if peticion_extra.save 行中的 main.user_solicitados"

【问题讨论】:

    标签: ruby-on-rails database model foreign-keys


    【解决方案1】:

    首先 - 你不能像你建议的那样有两个不同的关系,称为 :user

    class PeticionExtra < ActiveRecord::Base
      belongs_to :user, class_name: "User", foreign_key: "user_solicitante_id"
      belongs_to :user, class_name: "User", foreign_key: "user_solicitado_id"
    end
    

    尝试回答一个问题,如果你这样做应该返回什么

    PetitionExtra.last.user
    

    应该返回solicitado 还是solicitante

    尝试:

    class PeticionExtra < ActiveRecord::Base
      belongs_to :solicitante, class_name: "User"
      belongs_to :solicitado, class_name: "User"
    end
    

    我没有看到您的代码有任何其他明显的问题...

    【讨论】:

      【解决方案2】:

      问题在于迁移。当我建立 foreign_key: true 时,它一直在寻找 user_solicitante 和 user_solicitado 表。我解决了它,像这样改变迁移:

      class CreatePeticionExtras < ActiveRecord::Migration[5.1]
        def change
          create_table :peticion_extras do |t|
            t.references :user_solicitante, foreign_key: { to_table: :users }
            t.references :user_solicitado, foreign_key: { to_table: :users }
            t.timestamps
          end
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多