【问题标题】:What is the best way to structure this model/DB assiociations构建此模型/数据库关联的最佳方法是什么
【发布时间】:2014-08-08 17:14:21
【问题描述】:

我正在创建一个项目,我想以尽可能好的方式构建数据库。我有一个名为 Event 的模型,现在我希望单个事件(想想棒球比赛)属于一个月(即八月)并属于一个类别(即棒球)并属于一个用户(即 current_user)

换句话说,我希望一个月、一个类别和一个用户有很多事件,但我不希望这些事件重复。 相同的事件对象将通过以下方式返回:

august.events.find_by_id(1)
baseball.events.find_by_id(1)
current_user.events.find_by_id(1)

有什么建议吗?我最初的想法是像上面描述的那样设置关系。但我很好奇什么是创建事件对象的最佳方法,因为:

august.events.new("foo")
baseball.events.new("foo")
current_user.events.new("foo")

当我只想创建一个时,都会产生三个不同的事件对象。

我可以这样做吗?

Event.new(:category => "baseball", :month => "august")

那么声明用户“有那个”事件的最佳方法是什么,然后从那里运行诸如棒球.events.all 和 august.events.all 之类的命令。如果我想说类别 -> 体育 -> 棒球 -> 活动,我将如何深入了解协会的疯狂

感谢您的帮助,非常感谢。

【问题讨论】:

    标签: ruby-on-rails activerecord database-schema


    【解决方案1】:

    这本身并不是一个答案。主要是让大家对 API 的灵活性有个概念。


    据我所知,该架构是正确的。 Eventmonthcategory(或 category_id)和 user_id。您可以创建各种辅助方法来操作该模型。

    例如,有几个范围:

    class Event
      scope :for_month,    ->(m) { where(month: m) }
      scope :for_category, ->(c) { where(category: c) }
      scope :for_user,     ->(u) { where(user: u) }
    end
    
    # usage
    
    Event.for_month("august").for_category("baseball").for_user(current_user)
    
    # below, month "august" will be set on instance
    current_user.events.for_month("august").new("foo") 
    

    但所有这些都是毫无意义的。建立这些关系后,您可以通过UserCategory 访问Event 并自行填写详细信息:

    Event.where(month: "august", category: "baseball", user: current_user)
    current_user.events.where(month: "august", category: "baseball")
    
    current_user.events.new(month: "august", category: "baseball")
    

    有很多方法可以访问和操作这些数据。我不确定您是否可以比上述减少更多。您可能会发疯并添加具有多个参数的范围:

    class Event
      scope :for_mcu, ->(m, c, u) {
        for_month(m).for_category(c).for_user(u)
      }
    end
    
    # usage
    
    Event.for_mcu("august", "baseball", current_user)
    

    【讨论】:

    • 好的,非常感谢。是的,我只是想看看最佳实践是什么,如果有的话,似乎有很多方法可以做到这一点,而不是关于架构的一些预定义的 rails 关系。
    • @user3325383 就是这样,在 Ruby 中有很多方法可以实现相同的目标,而且主要是偏好。尽量不要关注查询方法,而是关注下面的模式(列等)。做对了,其余的都会到位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多