AssociationTypeMismatch嵌套属性

问题描述:

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

它的设置是这样的:

# 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 “,所以我认为这与我的属性有关。任何人都知道发生了什么事?

+0

我看到的是松鼠的第一件事是,你的评论有reviewer_id而不是一个ID,而且它属于该reviewer_id。看起来Reviewer应该属于:user。 – jjk

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

即时修复是在这里:

#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