我需要幫助實現或將其分解爲單表繼承(STI)。我已經閱讀過有關這方面的內容,但如果我以正確的方式開展工作,我還不太確定。如果你們有建議來實施它。或者,即使它與我現在有很大不同,請諮詢。STI幫助。需要幫助重構我現有的代碼
所以,通常我有以下類(所有模型)。
class Article < ActiveRecord::Base
has_many :attachments
has_many :medias
has_one :banner
accepts_nested_attributes :medias
...
end
class Attachment < ActiveRecord::Base
belongs_to :article
end
class Media < Attachment
default_scope { where(attachment_type: 'media') }
def audio?; media_type == 'audio'; end
def video?; media_type == 'video'; end
validate :embed_url, presence: true if :video?
def path
if audio?
# Different audio path
elsif video?
# Different video path
end
end
after_commit :process_audio_file
def process_audio_file; ...; end
after_commit :process_video_file
def process_video_file; ...; end
end
class Banner < Attachment
default_scope { where(attachment_type: 'banner') }
...
end
,通常它會正常工作太..
article = Article.first
first_media = article.medias.first
banner = article.banner
但後來我發現,Media
可能會是臃腫,有不同的東西太多不同的邏輯不同的media_types做。所以我試圖通過這樣做來區分它們:
class Article < ActiveRecord::Base
has_many :attachments
has_many :medias
has_one :banner
accepts_nested_attributes_for :medias
end
class Attachment < ActiveRecord::Base
belongs_to :article
end
class Media < Attachment
default_scope { where(attachment_type: 'media') }
end
class AudioMedia < Media
default_scope { where(media_type: 'audio') }
def path
# Audio path
end
after_commit :process_audio_file
def process_audio_file; ...; end
end
class VideoMedia < Media
default_scope { where(media_type: 'video') }
validate :embed_url, presence: true
def path
# Video path
end
after_commit :process_video_file
def process_video_file; ...; end
end
現在我在這裏將邏輯彼此分開。大!但現在它帶來像幾個問題:
article = Article.first
first_media = article.medias.first
在這樣做,我只是我在Media
類......爲了讓說AudioMedia
類,我要做的是:
"#{first_media.media_type}Media".constantize.find(first_media.id)
此外,爲了使我的nested_attributes能夠正常工作,我必須定義
accepts_nested_attributes_for :audio_medias
accepts_nested_attributes_for :video_medias
使其工作正確嗎?然後我不得不定義他們的關係,就像:
has_many :medias
has_many :audio_medias
has_many :video_medias
有什麼建議嗎?謝謝,歡呼!
編輯
添加相關的表和字段
articles
id
[some_other_fields]
attachments
id
article_id
attachment_type # media, banner, etc...
media_type # audio, video, etc...
[some_other_fields]
附件表中是否有'type'列? STI需要這個來確定單個記錄的類別 –
@MarkMeeus類型是什麼意思?我爲「文章」和「附件」添加了表格和字段。 – index
我在下面發佈了一個答案... –