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 “,所以我认为这与我的属性有关。任何人都知道发生了什么事?
答
行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
型号
除此之外,我认为你的主要问题是你的模型设置的方式。
理想情况下,你想有reviewer
和user
为同一数据集(我相信他们都是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
我看到的是松鼠的第一件事是,你的评论有reviewer_id而不是一个ID,而且它属于该reviewer_id。看起来Reviewer应该属于:user。 – jjk