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