gpt4 book ai didi

ruby-on-rails - STI、MTI 或 CTI,目前建议的 Rails 4 解决方案是什么?

转载 作者:行者123 更新时间:2023-11-29 11:25:52 24 4
gpt4 key购买 nike

我有一个基本的 events 表,并且想为每个事件类型(hikingpartyriverrun 等)。

我看到很多关于 CTI、MTI 和 STI 的旧帖子(2011/2012)。一些解决方案适用于 Heroku,而另一些则无效。

做这种事情的“当前”Rails 方法是什么?这是否已添加到 Rails 4.x 中?是否有一个神奇的 Gem 可以处理这个问题(在 Heroku 上使用 Postgres)?

一些有用的信息:

future 会有20-50个事件,每个分表可能有80列之多。该站点托管在 Heroku 上。运行 Rails 4.0.2

最佳答案

STI - 单表继承 正是您要寻找的。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html

您像往常一样创建您的模型,但您将属性 even_type 作为字符串添加到您的数据库中。 (默认为“类型”)您让 EventModel 知道,这将是继承列。

class Event < ActiveRecord::Base
self.inheritance_column = :event_type
# dont forget your scopes to easy access them by type
# Event.party or Event.ultrafestival
scope :party, -> { where(event_type: 'Party') }
scope :ultrafestival, -> { where(event_type: 'UltraFestival') }
scope :tomorrowland, -> { where(event_type: 'TomorrowLand') }


def host
raise "needs to be implemented in your sub-class!"
end

end

比你创建一些子类。确保那些继承自 Event

class Party < Event
end

class UltraFestival < Event
end

class Tomorrowland < Event
end

基本上,所有对象都是事件!所以如果你去 Event.all 你会得到所有的!从技术上讲,对象可以是其他东西。所有这些“事件”都将存储在同一个表中,它们的区别在于 event_type,在此示例中为“party”、“ultra_festival”或“tomorrowland”。

例如,现在您可以为每个类添加一些特殊的东西

 class Party < Event
def host
"private homeparty PTY"
end

def publish_photostream
end

def call_a_cleaning_woman
end
end

class UltraFestival < Event
attr_accessor :location

def host
"UMF Festival Corp."
end

def is_in_europe?
end

def is_in_asia?
end
end

class Tomorrowland < Event

def host
"ID&T"
end

def download_after_movie!
end

end

这是多年来的标准 Rails 方式。当然,它适用于每个主机和 postgres。

//编辑:如果你的子事件需要数据库中的一些特殊表,那么你需要去MTI,多表继承。

关于ruby-on-rails - STI、MTI 或 CTI,目前建议的 Rails 4 解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24267437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com