rails:为继承超类的模型创建脚手架?

时间:2013-04-06 16:36:40

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

我是Rails的新手,仍然让我的脚湿透了,所以请原谅我,如果这是微不足道的或“做错事”。

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

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

4 个答案:

答案 0 :(得分:3)

这是我考虑过使用我的应用程序的事情。我还没有完成它,如果你是铁杆新手,我也不会推荐它。我要么完全制作单独的模型,要么制作一个模型,并且具有属性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类。继承标记小于符号(<)。

# 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将决定哪种类型的用户可以设置什么。显然,你可以通过在超类中放置共享功能来解决这个问题。希望这有帮助

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

答案 1 :(得分:2)

通常我会这样做:

rails g scaffold People type:string name:string birth:date height:integer

class People < ActiveRecord::Base
end

重要的是使用保留字&#39;键入&#39;!那个表将保持类的类型。运行迁移。

因此,对于子类,您可以这样做:

rails g scaffold Men --parent=People

结果男人:

class Men < People
end

女性相同:

rails g scaffold Women --parent=People

所得

class Women < People
end

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

希望,有帮助!

答案 2 :(得分:0)

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

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

只需手动编辑它们。

答案 3 :(得分:0)