【问题标题】:rails: create scaffold for models to inherit from superclass?rails:为模型创建脚手架以从超类继承?
【发布时间】:2013-04-06 16:36:40
【问题描述】:

我是 Rails 的新手,我的脚还是湿的,所以如果这是微不足道的或“错误的方式”做事,请原谅我。

我想为一些脚手架模型创建一个超类。例如,我想为MenWomen 创建一个脚手架,但我希望它们都继承自People 超类; MenWomen 将从 People 类继承 heightweight 等字段。

我在哪里/如何定义这个People 超类?如何通过脚手架定义子类MenWomen

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 model scaffolding


    【解决方案1】:

    通常我会这样做:

    rails g scaffold People type:string name:string birth:date height:integer
    
    class People < ActiveRecord::Base
    end
    

    重要的是使用保留字'type'!那是表格将保留该类的类型的地方。运行迁移。

    所以,对于你可以做的子类:

    rails g scaffold Men --parent=People
    

    结果男性:

    class Men < People
    end
    

    女性也一样:

    rails g scaffold Women --parent=People
    

    结果

    class Women < People
    end
    

    不会为子类生成迁移。 我不确定,但这种方法仅适用于 STI。

    希望,有帮助!

    【讨论】:

      【解决方案2】:

      这是我考虑使用我的应用程序做的事情。我还没有这样做,如果您是 Rails 新手,我不会推荐它。我要么完全制作单独的模型,要么制作一个模型,并拥有属性gender,它应该是 0 或 1,然后制作一个返回相应性别的字符串的方法。

      编辑

      所以我打开了rails控制台,从我看到的情况来看,完全有可能,你需要做的就是声明类,如果你想使用不同的表,set_table_name

      class This < That
        set_table_name :this
      end
      
      class There < This
         set_table_name :there
      end
      

      或者您可以使用一张桌子,但如果您想保持干燥,我会使用两张。

      如果您想使用脚手架生成器,您必须为每个想要查看的班级(男性和女性)运行典型的 rails g scaffold Men。生成的模型继承自 ActiveRecord::Base 类。继承标记是小于号 (&lt;)。

      # THESE WILL BE THE DEFAULT GENERATED MODELS
      class Men < ActiveRecord::Base
      
      end
      
      class Women < ActiveRecord::Base
      
      end
      

      然后您将手动创建超类User

      class User < ActiveRecord::Base
      
      end
      

      然后编辑MenWomen 模型以从User 继承

      # men.rb
      class Men < User
      end
      
      # women.rb
      class Women < User
      end
      

      假设您想使用一个表进行子类化,您可以纠正该表的迁移,然后将 attr_accessible 添加到适当的子类中。

      attr_accessible 是一个 Rails 安全功能。它确定可以在批量分配中设置哪些属性。任何与安全性、网站排名等相关的内容都不应被访问。

      例子:

      attr_accessible :favorite_food, :interests, :password, :email # THIS IS GOOD
      
      attr_accessible :admin, :has_access_to_missile_launch_codes # THIS IS BAD
      

      因为那样的话有人可能会通过通过来破坏您的安全系统

      params =&gt; { :man =&gt; { :admin =&gt; true }}

      主要的一点是,使用这些attr_accessible 将决定哪种类型的用户可以设置什么。显然,您可以通过将共享功能放在超类中来解决这个问题。希望这会有所帮助

      您还应该了解super 关键字和self 关键字。如果您运行继承的设置,您最终会想要使用这些。

      【讨论】:

      • 是的,这个简单的例子你可能是对的。但是,如果我想跟踪特定于每个性别的信息怎么办?就像,如果我想为男性建立一个“mustache_style”字段,而不是女性?显然这是一个人为的例子,但即使是更精细的模型,也很难保持干燥和相关。
      • 好的,我明白你的意思了,我应该知道你在使用占位符类。我从不提供有关我在 SO 上的应用程序的信息。我会进行一些测试并回复您。
      • 我仍在学习如何将事物组合在一起;我很高兴它可以工作,但我不确定在哪里声明这些类。我是否像往常一样从命令行创建两个脚手架(“Men”和“Women”),然后手动编辑生成的代码以从“People”类继承?我在哪里声明“人”类(您的示例中的“那个”类)?
      • 太好了,这就是我要找的。让我测试一下,我会回复你的。谢谢!
      • 酷,记住,这可以被认为是bleeding edge,并且可能与一些流行的 gem 不兼容。并且不要忘记接受正确的答案!
      【解决方案3】:

      AFAIK 你需要调整现有的脚手架模板,我不相信有办法指定控制器基类。也就是说,我认为在 Rails 3 中,您可以将模板复制到 $ROOT/lib/templates/rails/...,其中 ... 取决于您要更改的内容。

      也就是说,在脚手架中执行此操作的真正目标是什么?一般而言,模型 (a) 很少是子类,(b) 更少是 same 子类。

      只需手动编辑它们。

      【讨论】:

      • 是的,我不完全确定是否需要脚手架;这基本上是一个练习。我正在尝试将 OOP 概念应用于 Rails:从概念上对其进行测试,学习如何建模。我知道 Ruby 可以做到这一点;然而,在 Rails 中,可能有更好的方法。无论如何,我在哪里可以找到那些脚手架模板?
      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 2012-04-06
      • 2016-03-26
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多