我有用户模型和组织模型。唯一的区别是组织has_many用户,所有其他属性是相同的。我不想把它放在一个表/模型中。如何删除此模型中重复的大量代码?我应该使用疑虑吗?我认为,如果用户模型看起来像是不正常的话:
class User < ActiveRecord::Base
include user_concern
end
那么,我如何在其他模型中扩展用户模型?以及如何使用rails g
生成此模型,其中包含所有用户的字段?
答案 0 :(得分:2)
我会关注而不是使用STI。 STI经常导致它解决的更多问题(类型不匹配,形成网址等),加上继承没有意义,这里:用户不是一种公司,公司不是一种用户。
我认为你的问题是一个命名问题。显然,您的关注点不应该是“UserConcern”。问题是:你关注的是什么样的方法?
您的方法是否与用户之间的社交关系有关?然后,您需要Socializable
关注。他们是否订阅邮件列表?那你需要Subscribable
关注。
即使他们只有一个方法,也可以有几个,因为开发人员不会想知道“这到底是做什么的?”如果所有问题都被正确命名。
您还应该让类级别方法调出问题。
如果可以将范围嵌入到关注点中(毕竟,它们在方法定义中解决),那么将关系置于其中就不那么自然了。
可以复制#has_many :foos
,我们在不同的模型中一直这样做,而且已经很难从模型中了解表模式而不会隐藏更多信息。
答案 1 :(得分:0)
您可以使用单表继承(STI)。要使其工作,您的模型需要type
- string
类型的字段,其中ActiveRecord存储您的记录的实际类型。然后,您只需为此扩展基础模型。
<强>迁移强>
add_column :users, :type, :string
<强>模型强>
class User < ActiveRecord::Base
和class Organisation < User
。
ActiveRecord现在将使用模型名称填充您的type
字段,并将它们存储在您的users
表中(因为这是组织模型继承的表)。
请查看http://api.rubyonrails.org/classes/ActiveRecord/Base.html的相应部分。
但是,在您的情况下,我会创建一个基本模型,例如Address
,然后从中扩展User
和Organisation
,以维护语义正确的模型。