Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:ActiveRecord::AssociationTypeMismatch错误_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

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对象,也可能是字符串