组织模型扩展了用户模型

时间:2013-10-30 08:52:34

标签: ruby-on-rails

我有用户模型和组织模型。唯一的区别是组织has_many用户,所有其他属性是相同的。我不想把它放在一个表/模型中。如何删除此模型中重复的大量代码?我应该使用疑虑吗?我认为,如果用户模型看起来像是不正常的话:

class User < ActiveRecord::Base  
  include user_concern
end

那么,我如何在其他模型中扩展用户模型?以及如何使用rails g生成此模型,其中包含所有用户的字段?

2 个答案:

答案 0 :(得分:2)

当心STI

我会关注而不是使用STI。 STI经常导致它解决的更多问题(类型不匹配,形成网址等),加上继承没有意义,这里:用户不是一种公司,公司不是一种用户。

这是一个命名问题

我认为你的问题是一个命名问题。显然,您的关注点不应该是“UserConcern”。问题是:你关注的是什么样的方法?

您的方法是否与用户之间的社交关系有关?然后,您需要Socializable关注。他们是否订阅邮件列表?那你需要Subscribable关注。

即使他们只有一个方法,也可以有几个,因为开发人员不会想知道“这到底是做什么的?”如果所有问题都被正确命名。

无论如何要复制什么

您还应该让类级别方法调出问题。

如果可以将范围嵌入到关注点中(毕竟,它们在方法定义中解决),那么将关系置于其中就不那么自然了。

可以复制#has_many :foos,我们在不同的模型中一直这样做,而且已经很难从模型中了解表模式而不会隐藏更多信息。

答案 1 :(得分:0)

您可以使用单表继承(STI)。要使其工作,您的模型需要type - string类型的字段,其中ActiveRecord存储您的记录的实际类型。然后,您只需为此扩展基础模型。

<强>迁移
add_column :users, :type, :string

<强>模型
class User < ActiveRecord::Baseclass Organisation < User

ActiveRecord现在将使用模型名称填充您的type字段,并将它们存储在您的users表中(因为这是组织模型继承的表)。

请查看http://api.rubyonrails.org/classes/ActiveRecord/Base.html的相应部分。

但是,在您的情况下,我会创建一个基本模型,例如Address,然后从中扩展UserOrganisation,以维护语义正确的模型。