Rails:为从超类继承的模型创建脚手架



我是Rails的新手,还在摸索中,所以请原谅我,如果这是琐碎的或"错误的方式"做事。

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

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

通常我这样做:

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。

希望它,帮助!

这是我想对我的应用程序做的事情。我还没有这样做,如果您是rails的新手,我不建议您这样做。我会完全制作单独的模型,或者制作一个模型,并具有属性gender,它应该是0或1,然后制作一个返回相应性别字符串的方法。

编辑

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

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

或者你可以用一张表,但如果你想保持DRY,我会用两张。

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

# 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 => { :man => { :admin => true }}

主要的一点是,使用这些attr_accessible将决定哪种类型的用户可以设置什么。显然,您可以通过在超类中添加共享特性来DRY它。希望能有所帮助

您还应该阅读super关键字和self关键字。如果您运行的是继承的设置,您最终将需要使用这些

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

也就是说,在脚手架上这样做的真正目的是什么?一般来说,模型(a)很少是子类,(b)甚至更少是相同的子类。

观看单表继承的视频。

http://railscasts.com/episodes/394-sti-and-polymorphic-associations


单表继承和在Rails中使用

最新更新