AssociationTypeMismatch嵌套属性

时间:2015-10-14 19:58:46

标签: ruby-on-rails activerecord

我遇到了相关模型的问题。我的用户和审阅者都有嵌套属性。用户可以基本上审查另一个人,从而成为审阅者并成为审查人员。

它的设置如下:

  # User
  has_many :reviewers
  accepts_nested_attributes_for :reviewers
  has_many :active_managements, class_name: 'Reviewer',
                                foreign_key: 'reviewer_id',
                                dependent: :destroy


class Reviewer < ActiveRecord::Base
  belongs_to :user
  belongs_to :reviewer_id, class_name: 'User'
end

现在在我的用户控制器中我有:

class UsersController < ApplicationController


  def edit
    @user = User.find(params[:id])
    @user.reviewers.build
    redirect_to root_url && return unless @user.activated?
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      redirect_to edit_user_path(@user)
    else
      render 'edit'
    end
  end

  private

  def user_params
    params.require(:user).permit(:invitation_token, :first_name, :admin,
                                 :last_name, :title, :email, :password,
                                 reviewers_attributes: [:reviewer_id])
  end

我得到的错误是:

User(#70197180889680) expected, got String(#70197172430700)

发生在“user_params”上,所以我认为它与我的属性有关。有谁知道发生了什么事?

2 个答案:

答案 0 :(得分:3)

belongs_to :reviewer_id, class_name: 'User'行不正确。尝试将其更改为belongs_to :reviewing_user, class_name: 'User'(将reviewing_user替换为您要用于此关联的名称:),而不是字段名称。

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to

答案 1 :(得分:1)

立即解决此问题:

#app/models/review.rb
class Reviewer < ActiveRecord::Base
   belongs_to :reviewer
end

-

这就是我解决系统性问题的方法:

#config/routes.rb
resources :users do
   resources :reviewers #-> url.com/users/:user_id/reviews/new
end

#app/controllers/reviewers_controller.rb
class ReviewersController < ApplicationController
   def new
       @user = User.find params[:user_id]
       @review = user.reviewers.new
   end

   def create
       @user = User.find params[:user_id]
       @review = user.reviewers.new reviewer_params
   end

   private

   def review_params
      params.require(:reviewer).permit(:user_id, :reviewer_id)
   end
end

<强>模型

除此之外,我认为您的主要问题是您的模型的设置方式。

理想情况下,您希望将revieweruser作为相同的数据集(我认为它们都是users),这会使您当前的设置效率非常低。 ..

#app/models/user.rb
class User < ActiveRecord::Base
   has_and_belongs_to_many :reviewers,
      class_name:              "User",
      join_table:              :reviewers_users
      foreign_key:             :user_id,
      association_foreign_key: :reviewer_id
end

您正在寻找的是self referrential association,它基本上允许您在many-to-many关系中关联同一模型。

在大多数情况下,这将与has_and_belongs_to_many关系一起使用;您也可以使用has_many :through,但它并不常见。

以上将允许您使用以下内容:

@user = User.find params[:id]
@user.reviewers #-> collection of users who are reviewers of original user