2015-10-14 242 views
0

我遇到了關聯模型的問題。對於我的用戶,我有一個嵌套的屬性給審閱者。用戶可以基本上審查另一個人,從而成爲審閱者,併成爲審閱人。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

回答

0

即時修復是在這裏:

#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