【问题标题】:Rails - a model that can have two different sub itemsRails - 可以有两个不同子项的模型
【发布时间】:2012-05-08 03:14:46
【问题描述】:

我有一个带有常用字段的标准设计用户模型。

这适用于人们正在寻找住宿地点或有住宿地点的情况。所以我有两类用户,一个人可以是。这两个类别非常不同(即,寻找住宿地点的人与有住宿地点的人拥有截然不同的领域)。

所以用户有:

User: name, email, password, profile_id

用户也可以拥有个人资料(即他们正在寻找房子)。

Profile: age, sexuality, religion, occupation

这就是我目前所拥有的。现在我需要稍微改变一下,这样用户就可以拥有个人资料,或者......他们可以拥有房子(即他们有房子并且正在寻找更多人):

House: price_per_week, address, etc

如何最好地在 ActiveRecord 中建模?某种多态关联?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我发现,一般来说,如果多态关系建模的对象略有不同,多态关系就不会随着时间的推移而运作良好。对于您的情况,我建议将这两个对象分开。

    一般来说,最好的方法是考虑您想要检索数据的方式。例如,我想您想同时访问两者:

    @user.house
    

    @user.profile
    

    所以我建议首先在users 表和profileshouses 表之间设置关系(可以是可选的)。我还要添加一个type 字段,可用于确定用户是两种类型中的哪一种。

    这允许用户是任何一种类型,并允许他们同时拥有profilehouse

    因此,belong_to 用户和用户have_many(或have_one)的房屋和个人资料都有房屋和个人资料

    【讨论】:

    • 是的,我感觉多态在这里也不合适。我对 Rails 还是很陌生。如果我在用户和配置文件(和房屋)表之间存在关系,那么我肯定必须在需要其中一个或另一个的地方进行检查。例如,即使使用类型字段,我也必须在获得用户之前检查用户是否拥有房屋或个人资料?这不是一件坏事吗?好像有点……尴尬。
    • 我还不会担心这些细节。您可以在需要时使用范围或其他属性来获取所需的模型。
    • 好的,完成了。所以我可以创建一个有房子的用户,并通过user.house访问,或者我可以去house.user。凉爽的。但是同一用户可能有个人资料。现在有办法强制执行该约束吗?用户不应该有个人资料。这没什么大不了的,但它会很好。
    • 当然。老实说,我建议接受这个答案并发布一个新问题,询问如何强制执行约束——发布你拥有的最新代码。然后你就可以得到我的想法和其他关于这部分工作的想法。
    • 好主意。感谢您的帮助
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多