【问题标题】:Error building association with two foreign_key references与两个外键引用建立关联时出错
【发布时间】:2018-07-24 18:15:26
【问题描述】:

我有一个用户和推荐模型。用户有多种账户类型:学生、管理员、推荐人等。学生用户可以指定推荐人提交推荐。我没有使用 Rolify 所以

我目前有:

    class Recommendation < ApplicationRecord
    belongs_to :assigner, class_name: "User", foreign_key: "user_id"
    belongs_to :writer, class_name: "User", foreign_key: "writer_id"
    end

    class User < ApplicationRecord
     has_many :recommendations_via_assigning, class_name: "Recommendation", foreign_key: :assigner_id
     has_many :recommendations_via_writing, class_name: "Recommendation", foreign_key: :writer_id


    class CreateRecommendations < ActiveRecord::Migration[5.1]
      def change
        create_table :recommendations do |t|

          t.integer :writer_id, foreign_key: true
          t.integer :assigner_id, foreign_key: true
          t.text    :text

          t.timestamps
        end
        add_index :recommendations, :writer_id
        add_index :recommendations, :assigner_id
      end
    end

控制器

     def new
     @recommendation = current_user.recommendations_via_assigning.build
     end

     def create
         @recommendation = current_user.recommendations_via_assigning.build(recommendation_request_params)
         if @recommendation.save
           @recommendation.send_invitation_email
           flash[:info] = "An email with submission instructions has been sent to the recommender you have invited."
           redirect_to user_url
         else
           render 'new'
         end
       end

     private
     def recommendation_request_params
         params.require(:recommendation).permit(:assigner_id, :first_name, :last_name, :email, :relationship)
       end

       def recommendation_content_params
         params.require(:recommendation).permit(:writer_id, :first_name, :last_name, :email, :text)
       end

我无法保存推荐,因为它需要 writer_id,提交推荐#create 时不会知道该推荐。需要做的是向提供的电子邮件地址发出一封电子邮件,邀请教师创建一个帐户,并且当该帐户注册时,通过 id 与教师帐户的 writer_id 进行推荐。

如何修改现有代码,以便在没有 writer_id 的情况下通过推荐#create?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 associations


    【解决方案1】:

    推荐的未知属性'user_id',所以我认为我没有正确设置它。

    是的,您提供 user_id 作为外键,但推荐表中不存在 user_id 列。您需要将assigner_id 重命名为user_id 或删除:foreign_key 设置,因为Rails 可以按照惯例解决:

    class Recommendation < ApplicationRecord
      belongs_to :assigner, class_name: "User"
      belongs_to :writer, class_name: "User"
    end
    

    关于has_many :recommendations 的注释。这一行实际上要求user_id 存在于recommendations 表中。 Rails 想不通,您是否希望通过写作或通过分配获得推荐。在这里您可能想根据docs 提供foreign_key 选项:

    class User < ApplicationRecord
      has_many :recommendations_via_assigning, class_name: "Recommendation", foreign_key: :assigner_id
      has_many :recommendations_via_writing, class_name: "Recommendation", foreign_key: :writer_id
    end
    

    【讨论】:

    • 谢谢,但我对如何使用 Recommendations_via_assigning 和 ""via_writing.假设我有一个学生创建推荐 #1,然后我会使用@user.recommendations_via_assigning.build 创建推荐资源吗?对于教师用户更新该推荐,我会使用@user.recommendations_via_writing 并传递更新的参数吗?我不知道如何在没有指明 writer_id 的情况下构建 Recommendation_via_assigning 或者这是否是我需要做的事情。
    • 接下来,我是否需要为此创建两个控制器 Recommendations_via_assigning 和 Recommendations_via_writing?
    • 推荐可以同时有assigner_id和writer_id吗?
    • 是的,assigner_id 是学生,writer_id 是老师。将发布包含新问题的更新帖子
    • 我的意思是,assigner_id 和 writer_id 可以同时不为零吗?老师和学生可以同时推荐吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2023-03-30
    相关资源
    最近更新 更多