我遇到了相关模型的问题。我的用户和审阅者都有嵌套属性。用户可以基本上审查另一个人,从而成为审阅者并成为审查人员。
它的设置如下:
# 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 :(得分: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
<强>模型强>
除此之外,我认为您的主要问题是您的模型的设置方式。
理想情况下,您希望将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