我有两个模型具有与同一对象的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
答案 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
尽管有一个警告。...用户是必不可少的这种关系,所以如果某人未登录,这种关系就会中断!考虑一下……要么不创建访问,要么创建匿名访问。