我正在创建一个项目,我希望以尽可能最好的方式构建数据库。我有一个名为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之类的命令。如果我想说类别 - >我将如何深入探讨协会的疯狂?体育 - >棒球 - >事件
感谢您的帮助,非常感谢。
答案 0 :(得分:0)
这本身并不是一个答案。它主要是为了让您了解API的灵活性。
根据我所知,模式是正确的。 Event
有month
和category
(或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")
但所有这一切都毫无意义。有了这些关系,您可以从Event
或User
访问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)