加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails – 从另一个模型中创建模型的实例

发布时间:2020-12-17 03:24:51 所属栏目:百科 来源:网络整理
导读:我有一个应用程序,我正在构建,我需要一个模型来创建另一个模型的实例.我希望每辆车都有4个轮胎. 汽车模型 class Car ActiveRecord::Base has_many :tires after_create :make_tires def make_tires 4.times { Tire.create(car: self.id) } endend 轮胎模型 c
我有一个应用程序,我正在构建,我需要一个模型来创建另一个模型的实例.我希望每辆车都有4个轮胎.

汽车模型

class Car < ActiveRecord::Base
  has_many :tires

  after_create :make_tires

  def make_tires
    4.times { Tire.create(car: self.id) }
  end
end

轮胎模型

class Tire < ActiveRecord::Base
  belongs_to :car
end

但是,在make_tires内部存在一个错误,即如果我为Tire尝试它,则没有用于create或new的activerecord方法.当我检查轮胎时,它没有那些方法.

我该如何解决这个问题?

错误是这样的:未定义的方法’create’为ActiveRecord :: AttributeMethods :: Serialization :: Tire :: Module

我测试了两种环境:测试和开发,它们都因同一错误而失败.

解决方法

这是名称冲突.我解释时坐下来放松一下.

解释说明:

在Ruby类中,只是类Class的实例(它是类Module的子类). Module的实例(包括Class的实例)是非常奇怪的对象,特别奇怪的是它们与ruby常量的连接.您可以使用标准ruby表示法随时创建一个新类:

my_class = Class.new { attr_accessor :a }
instance = my_class.new
instance.a = 3
insatnce.a   #=>
instance.class.name #=> nil

好吧,我们班没有名字.这只是一个匿名课程.班级如何获得他们的名字?通过将其分配给常量(第一次):

MyClass = my_class
my_class.name   #=> 'MyClass'

使用class关键字定义类时:

class MyClass
  ...
end

您只需创建一个新的Class实例并将其分配给常量.因此,看到常量的Ruby编译器不知道它是一个类还是一个数字 – 它必须对该常量进行全面搜索.

找到常量的逻辑非常复杂,取决于当前的嵌套.你的情况非常简单(因为没有嵌套),所以ruby将首先尝试在你的类中找到Tire类,当它失败时它的子类和包含的模块.

你的问题是你的类继承自ActiveRecord :: Base(这是正确的),它包括ActiveRecord :: AttributeMethods :: Serialization模块,它已经定义了Tire常量.因此,ruby将使用此常量,因为这是给定上下文中该名称的最佳匹配.

要修复它,你必须告诉编译器不要在当前类中查看,而是直接在“top namespace”中(在ruby中是Object.严重的是,尝试Object.constants) – 你可以在你面前使用::常数,像::轮胎.

注意:尽管它有效,但这个问题首先警告您代码开始闻到.您应该照看这个ActiveRecord :: AttributeMethods :: Serialization :: Tire :: Module,因为它似乎将来会遇到它多次.

其他的东西:

您可以稍微简化您的方法:

def make_tires
  4.times { tires.create }
end

此时您可能会遇到一些最初的错误.如果你这样做,那么请查看Tire :: Module的内容.如果你不关心气味:

has_many :tires,class_name: '::Tire'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读