我是 Rails 的新手,我的脚还是湿的,所以如果这是微不足道的或“错误的方式”做事,请原谅我。
我想为一些脚手架模型创建一个超类。例如,我想为Men
和 for创建一个脚手架Women
,但我希望它们都继承自People
超类;Men
并且会从类Women
继承像height
和类的字段。weight
People
我在哪里/如何定义这个People
超类?如何定义子类Men
和Women
通过脚手架?
我是 Rails 的新手,我的脚还是湿的,所以如果这是微不足道的或“错误的方式”做事,请原谅我。
我想为一些脚手架模型创建一个超类。例如,我想为Men
和 for创建一个脚手架Women
,但我希望它们都继承自People
超类;Men
并且会从类Women
继承像height
和类的字段。weight
People
我在哪里/如何定义这个People
超类?如何定义子类Men
和Women
通过脚手架?
通常我会做类似的事情:
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
或者你可以使用一张桌子,但如果你想保持干燥,我会使用两张。
如果你想使用脚手架生成器,你必须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
然后编辑要继承的Men
和模型Women
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
关键字的信息。如果您运行继承的设置,您最终会想要使用这些。
AFAIK 你需要调整现有的脚手架模板,我不相信有办法指定控制器基类。也就是说,我认为在 Rails 3 中,您可以将模板复制到$ROOT/lib/templates/rails/...
您...
想要更改的位置。
也就是说,在脚手架中执行此操作的真正目标是什么?一般来说,模型将 (a) 很少是子类,并且 (b) 更罕见的是同一个子类。
只需手动编辑它们。