构建此模型/数据库关联的最佳方法是什么

时间:2014-08-08 17:14:22

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

我正在创建一个项目,我希望以尽可能最好的方式构建数据库。我有一个名为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")

然后宣布用户的最佳方法是什么?#34; event,从那里运行诸如baseball.events.all和august.events.all之类的命令。如果我想说类别 - >我将如何深入探讨协会的疯狂?体育 - >棒球 - >事件

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

1 个答案:

答案 0 :(得分:0)

这本身并不是一个答案。它主要是为了让您了解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") 

但所有这一切都毫无意义。有了这些关系,您可以从EventUser访问Category并自行填写详细信息:

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)