Ruby on rails 构造此模型/DB关联的最佳方法是什么

Ruby on rails 构造此模型/DB关联的最佳方法是什么,ruby-on-rails,activerecord,database-schema,Ruby On Rails,Activerecord,Database Schema,我正在创建一个项目,我希望以最好的方式构建数据库。我有一个名为Event的模型,现在我希望单个事件(比如棒球比赛)属于一个月(即8月),属于一个类别(即棒球),属于一个用户(即当前用户) 换句话说,我希望一个月、一个类别和一个用户有许多事件,但我不希望重复这些事件。 相同的事件对象将通过以下方式返回: august.events.find_by_id(1) baseball.events.find_by_id(1) current_user.events.find_by_id(1) 有什么建议

我正在创建一个项目,我希望以最好的方式构建数据库。我有一个名为Event的模型,现在我希望单个事件(比如棒球比赛)属于一个月(即8月),属于一个类别(即棒球),属于一个用户(即当前用户)

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

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")
那么,最好的方法是什么来声明一个用户“拥有那个”事件,并从那个里运行命令,比如batball.events.all和august.events.all。如果我想说分类->体育->棒球->赛事,我该如何深入到协会的疯狂中去呢

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

这本身并不是一个答案。主要是让您了解API的灵活性


据我所知,这个模式是正确的<代码>事件有
月份
类别
(或
类别id
)和
用户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") 
但所有这些都是毫无意义的。有了这些关系,您可以从
用户
类别
访问
事件
,并自己填写详细信息:

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中有很多方法可以实现同样的效果,这主要是首选项。尽量不要关注查询方法,而是关注下面的模式(列等)。把这件事做好,剩下的事情就会安排妥当。