【问题标题】:AssociationTypeMismatch nested attributesAssociationTypeMismatch 嵌套属性
【发布时间】:2015-10-15 18:04:43
【问题描述】:

我遇到了关联模型的问题。我的用户有一个嵌套属性,供审阅者使用。用户基本上可以评论另一个人,因此成为评论者并成为被评论的人。

它是这样设置的:

  # 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”上,所以我认为它与我的属性有关。有谁知道怎么回事?

【问题讨论】:

  • 我看到的第一件事就是你的 Reviewer 有一个 reviewer_id 而不是一个 id,而且它属于那个 reviewer_id。看起来 Reviewer 应该只属于 :user。

标签: ruby-on-rails activerecord


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    立即修复在这里:

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2017-11-29
      • 1970-01-01
      相关资源
      最近更新 更多