Ruby on rails Rails:ActiveRecord::AssociationTypeMismatch错误
是否可以在一个表中包含以下两列,并将其与活动记录一起保存:Ruby on rails Rails:ActiveRecord::AssociationTypeMismatch错误,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,是否可以在一个表中包含以下两列,并将其与活动记录一起保存: user\u name\u id(这是一个关联) 用户名(仅文本) 演示保存关联字段用户名\u id和文本字段用户名 以下是模型: #app/models/blog.rb class Blog < ApplicationRecord belongs_to :user_name end #app/models/user_name.rb class UserName < ApplicationRecord has_
(这是一个关联)user\u name\u id
(仅文本)用户名
用户名\u id
和文本字段用户名
以下是模型:
#app/models/blog.rb
class Blog < ApplicationRecord
belongs_to :user_name
end
#app/models/user_name.rb
class UserName < ApplicationRecord
has_many :blogs
end
当我提交表单以创建新的博客
时,它会出错。参数散列看起来正常:
“blog”=>{“user_name_id"=>"1", “user_name"=>”foo”}
但是,我得到以下错误:
ActiveRecord::AssociationTypeMismatch
应为用户名(#70119900697480),获取字符串(#70119800086640)
更新:我理解,理想情况下:这些属性之一的列名应该更改。尽管如此:是否可以用rails来实现这一点?需要做什么?当您执行以下操作时:
belongs_to :user_name
ActiveRecord假设Blog
有一个属性user\u name\u id
(看起来你已经有了这个属性-到目前为止,还不错)。如中所述,您还将获得一个setter方法,user\u name=
,该方法期望您将向其传递一个UserName
实例
当您执行以下操作时:
Blog.new(“user_name_id"=>"1", “user_name"=>”foo”)
blog.user_name.name
ActiveRecord希望user\u name
是类UserName
的实例。但是您刚刚给它传递了一个字符串
。这正是错误告诉你的
此外,我同意亚历克西的观点。我不知道你为什么要把user\u name
(作为字符串)保存在博客上。如果类UserName
具有name
属性,则您始终可以执行以下操作:
Blog.new(“user_name_id"=>"1", “user_name"=>”foo”)
blog.user_name.name
我也同意Alexey的观点,UserName
是一个奇怪的类名。阿列克谢关于命名的建议是好的,所以请考虑它们。
如果您已经使用“用户名”字段,则不应使用“用户名”字段
请不要调用模型“UserName”,这不好,可能这是UserProfile或只是User李>
您确定要为您的博客缓存用户名吗?若用户将更改其名称,则会产生许多问题。若你们想为博客缓存用户名,你们可以重命名“user\u name\u cached”上的列,并在“UserName”上进行更新,在保存回调之前更新
作者更新的更新:
归属:你的新的归属于名称,类名:'NameUser',外键:'name\u user\u id'
从上面的答案可以明显看出问题-将user\u name
属性改为其他名称
作为最后的手段,这可能是一个不好的建议,但您甚至可以尝试声明您正在使用的属性,如:
class Blog < ApplicationRecord
belongs_to :user_name, through: :user_name_id
end
classblog
但同样,您关联记录的原因是,您可以在任何时候通过关联调用user_name,并获取存储在其中的所有信息。也就是说,你不需要在博客中存储用户名。。。因为你已经通过用户名关联了。显示这两个模型,博客的控制器博客是否属于名为user\u name或user的表?属于名为user\u names的实际表我同意盖茨的观点-发布所有信息,并立即包含格式添加信息无需通过;)如果保留这两个属性,则肯定需要通过声明要关联的属性来分隔它们。这就是他一开始就遇到问题的原因。不幸的是,在应用程序中,两个表列名无法在应用程序中更改。带有\u id
的列表示关联(如果存在),没有\u id
的列表示未在集合中列出的名称。为什么不能更改它们?似乎有两种选择:调用其中一个或声明与博客模型中的用户名关联的属性。我会删除博客中的用户名,因为将其存储在那里没有意义。我会把用户id放在博客里。若我想要这个名称,我将从用户表中获取它。如果用户更新了他的个人资料,博客将有错误的名称lol,除非它得到处理。而这种建筑是反对真理的单一来源!!!请查看更新的问题。这只是一个演示问题的快速演示代码。请查看更新的问题。这只是一个演示问题的快速演示代码。如果您想保护原始的“user_name”方法名,我认为您必须编写自己的getter/setter方法def user name;UserName.where(id:self.user_name_id)。first | | self.user_name;结束
但在这种情况下,您将获得奇怪的代码行为:您的变量可能是AR对象,也可能是字符串