2014-06-17 14 views
7

Tôi có bảng events cơ bản và muốn có các bảng phụ cho từng loại sự kiện (hiking, party, riverrun, v.v ...).STI, MTI hoặc CTI, giải pháp Rails 4 hiện được đề xuất?

Tôi thấy rất nhiều bài đăng cũ (2011/2012) về CTI, MTI và STI. Một số giải pháp làm việc cho Heroku, trong khi những giải pháp khác thì không.

Cách thức "hiện tại" Đường ray để thực hiện loại điều này là gì? Điều này đã được thêm vào Rails 4.x? Có một Gem huyền diệu nào xử lý được điều này (với Postgres trên Heroku) không?

Một số thông tin nếu nó giúp:

Trong tương lai, sẽ có giữa 20-50 sự kiện, và mỗi tiểu bảng có thể càng nhiều càng 80 cột. Trang web được lưu trữ trên Heroku. Chạy Rails 4.0.2

+0

có thể cung cấp cho tôi một số feedbeck về câu trả lời của tôi để cho tôi biết nếu bạn cần trợ giúp thêm –

Trả lời

0

STI - Thừa kế bảng đơn là những gì bạn đang tìm kiếm. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html

Bạn tạo mô hình như thường lệ nhưng bạn thêm thuộc tính even_type làm chuỗi vào cơ sở dữ liệu của mình. (mặc định ist "type") Bạn để EventModel biết, rằng đây sẽ là cột thừa kế.

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 

Hơn bạn tạo một số lớp con. Đảm bảo những người được kế thừa từ Event

class Party < Event 
end 

class UltraFestival < Event 
end 

class Tomorrowland < Event 
end 

Về cơ bản, tất cả các đối tượng là sự kiện! Vì vậy, nếu bạn đi Event.all bạn sẽ nhận được tất cả! Về mặt kỹ thuật, một Object có thể là một thứ khác. Tất cả những "Sự kiện" đó sẽ được lưu trữ trong cùng một bảng, chúng sẽ khác nhau theo số event_type, trong ví dụ này là "đảng", "cực kỳ" hoặc "ngày mai".

Bây giờ bạn có thể thêm một số công cụ đặc biệt để mỗi người trong số những lớp ví dụ

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 

Đây là Rails cách tiêu chuẩn - kể từ năm. Tất nhiên nó làm việc trên mỗi con hoster và với postgres.

// chỉnh sửa: nếu các sự kiện phụ của bạn cần một số bảng đặc biệt trong cơ sở dữ liệu, thì bạn cần phải đi MTI, đa bảng kế thừa.

Các vấn đề liên quan