【问题标题】:How can one object belong to/have two users?一个对象如何属于/拥有两个用户?
【发布时间】:2015-12-05 16:47:40
【问题描述】:

我有一个用户模型和一个偏好模型。用户可以向其他用户请求帮助,或者他们可以发布一个帮助,说如果有人需要帮助,他们可以提供帮助。

我的问题是建立关系的最佳方式是什么,以便一个 Favor 对象可以属于/拥有两个用户,一个请求帮忙,一个帮忙?

非常感谢!

【问题讨论】:

    标签: ruby-on-rails polymorphic-associations model-associations single-table-inheritance


    【解决方案1】:

    如果我要实现这个,我会在两个不同的属性上创建Favor 模型belongs_to 两个Users。例如,您可以拥有 favor_fromfavor_to 属性(每个都只是与 User 的关系)。

    这使您无需处理确定哪个用户是哪个用户。如有必要,您甚至可以为这两个属性使用has_and_belongs_to_many 关系——这将允许您有一个Favor 属于多个用户。然后,可以由多个用户提供帮助,或者多个用户可以收到帮助。

    【讨论】:

    • 非常感谢!完美的属性命名。您如何建议我将 ID 保存到 favor_fromfavor_to?目前我有<%= link_to 'Publish a Favor', new_favour_path(favor_from: current_user.id)<%= link_to 'Ask a Favor', new_favour_path(favor_to: current_user.id)
    • @fardin 您可能想在后端进行一些验证,以确保用户不能代表另一个用户发布优惠 - 取出路径生成器中的参数,然后参考current_user 在控制器中。
    • 我肯定会这样做,但是在创建操作中,我如何知道当前用户是在做还是得到青睐?我觉得这个问题有一个明显的答案,我想不通:D
    • @fardin 我只创建两个动作,一个用于创建提供的帮助,一个用于创建请求的帮助。
    【解决方案2】:

    User型号has_manyfavorsFavor可以belong_toUser

    命名可以更好,但这里是它的要点:

    class Favor
      belongs_to :favor_asker, class_name: 'User'
      belongs_to :favor_doer, class_name: 'User'
    end
    
    class User
      has_many :asked_favors, class_name: 'Favor'
      has_many :done_favors, class_name: 'Favor'
    end
    

    【讨论】:

    • 反对票是怎么回事?我已经使用过它并且知道它有效。
    • 非常感谢您的回答。在这个阶段我什至不能投票,因为我还没有赢得 15 个声望!我是新手:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多