【问题标题】:Ruby on Rails inheritance with new attributes?带有新属性的 Ruby on Rails 继承?
【发布时间】:2017-05-21 19:42:43
【问题描述】:

我一直在搜索有关 ruby​​ on rails 继承的信息,但我只能找到没有新属性的继承,如下所示:

class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end

并向表中添加一个新的类型字段

class CreateAnimals < ActiveRecord::Migration
  def self.up
    create_table :animals do |t|
      t.string :name
      t.string :race
      t.string :type
    end
  end
end

但是,例如,如何向 Dog 添加新属性? 就像,狗有一个从动物继承的“名字”和一个“种族”,但我如何添加只有狗才有的“bark_type”?

【问题讨论】:

    标签: ruby-on-rails ruby inheritance


    【解决方案1】:

    我相信您正在寻找的是单表继承 (STI)。基本上,您在数据库中有一个名为 Pets 的表,它具有所有必需的属性(包括子类的属性),并且您有一个“类型”列,该列应该为非空,并且它是您存储子类的列,例如“狗"

    有一个很好的例子,有宠物、狗和猫的例子here

    例子

    DogsController

       def new
        @dog = Dog.new
       end
    
       def create
        @dog = Dog.new(dog_params)
        if @dog.save
         ...
        end
       end
    
    private 
    
      def dog_params
        params.require(:dog).permit(:name, :age)
      end
    end
    

    重要

    通过调用Dog.new 而不是Pet.new 就像对activerecord 说这是Pet 表的新记录,并在名为“type”的列中添加字符串“dog”

    注意 2:如果您不想为猫模型保存 :age 参数,则您的表单中没有年龄字段。但是因为对于狗,您还需要年龄,所以 Pets 表应该有一个年龄列,该列将被 Dog 模型使用

    【讨论】:

    • 是的,这是 STI,我只是不确定如何在 Rails 上执行此操作。我会在宠物桌上保存一个用于狗的控制器和一个用于猫的控制器吗?我该怎么做?您链接的示例在猫/狗类中没有任何新属性
    • 请仔细阅读我提供的链接。正如我所说,猫或狗的所有属性都需要是宠物表上的列。 Pet 表的类型列将具有子类,例如“dog”。我会用一个小例子来更新我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2014-03-15
    相关资源
    最近更新 更多