为什么我不断收到此ActiveRecord :: AssociationTypeMismatch错误?

时间:2019-02-08 03:28:07

标签: ruby-on-rails ruby ruby-on-rails-4

我有两个模型具有与同一对象的has_many关联。我有一个用户,一个管理员和一个访问。

用户has_many次访问 管理员has_many次访问

每次创建与用户的访问都可以,但是当我与管理员一起使用时,会给我一个错误:

ActiveRecord::AssociationTypeMismatch

完整的错误是这样的:

User(#70282715553200) expected, got #<Admin id: 2, email: "admin@gmail.com", created_at: "2019-02-07 12:08:40", updated_at: "2019-02-07 12:08:40"> which is an instance of Admin(#70282709528720)

def create
  @visit = @service.visits.new(visit_params)

  if user_signed_in?
    @visit.user = current_user
  else
    @visit.user = current_admin
  end

  if @visit.save
    redirect_to service_visits_path(@service)
  else
    redirect_to @services
  end

end

=============================

class Admin < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and 
  # :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :visits, dependent: :destroy
end

=============================

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and 
  #  :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :validatable

  has_many :visits, dependent: :destroy
end

=============================

class Visit < ApplicationRecord
  belongs_to :user
  belongs_to :admin
  belongs_to :service
end

2 个答案:

答案 0 :(得分:2)

除非您正在进行某种多态性(未记录),否则我将尝试更改此方式:

$tagname = '%' . $_POST['search'] . '%';

对此:

if user_signed_in?
  @visit.user = current_user
else
  @visit.user = current_admin
end

您的if user_signed_in? @visit.user = current_user else @visit.admin = current_admin # this line end 模型说,一次访问既有一个Visit也有一个User,因此您必须将current_admin分配给Admin,而不是{{1} }。

如果您使用的是Rails 5,则还需要如下更新模型:

@visit.admin

正如我在下面的评论中指出的那样,@ bo-oz的建议应得到充分考虑。我还没有看到User和Admin表通常会像在生产应用程序中一样拆分出来。 “ admin”的概念通常作为单独的@visit.user模型处理(使用rolify gem对此很有用),或更简单地作为class Visit < ApplicationRecord belongs_to :user, optional: true belongs_to :admin, optional: true belongs_to :service end 模型上的布尔值处理。

答案 1 :(得分:0)

我认为您要为我们做的事情是完全错误的。管理员也是用户。您应该完全删除管理员模型。如果您需要为某人分配其他功能/权限,则应该创建其他属性(管理员布尔是/否),或者创建某种基于角色的模型。看看Rolify宝石。

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and 
:omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :validatable

  has_many :visits, dependent: :destroy

  def is_admin?
    // return true if user is admin
  end
 end

class Visit < ApplicationRecord
  belongs_to :user
  belongs_to :service
end

def create
@visit = @service.visits.new(visit_params)

if user_signed_in?
  @visit.user = current_user
else

if @visit.save
  redirect_to service_visits_path(@service)
else
  redirect_to @services
end

尽管有一个警告。...用户是必不可少的这种关系,所以如果某人未登录,这种关系就会中断!考虑一下……要么不创建访问,要么创建匿名访问。