Rails has_many STI 与子 STI

Rails has_many STI with sub STI

我认为这更像是一个 "Model Design" 问题,而不是 rails 问题。

为清楚起见,这里是业务逻辑:我有场地,我想实施多个 API 以获取有关这些场地的数据。所有这些 API 有很多共同点,因此我使用了 STI。

# /app/models/venue.rb
class Venue < ApplicationRecord
  has_one :google_api
  has_one :other_api
  has_many :apis
end

# /app/models/api.rb
class Api < ApplicationRecord
  belongs_to :venue
end

# /app/models/google_api.rb
class GoogleApi < Api
  def find_venue_reference
    # ...
  end
  def synch_data
    # ...
  end
end

# /app/models/other_api.rb
class OtherApi < Api
  def find_venue_reference
    # ...
  end
  def synch_data
    # ...
  end
end

这部分有效,现在我要添加的是场地的照片。我将从 API 中获取这些照片,我意识到每个 API 都可能不同。我也考虑过为此使用 STI,我最终会得到类似的结果

# /app/models/api_photo.rb
class ApiPhoto < ApplicationRecord
  belongs_to :api
end

# /app/models/google_api_photo.rb
class GoogleApiPhoto < ApiPhoto
  def url
    "www.google.com/#{reference}"
  end
end

# /app/models/other_api_photo.rb
class OtherApiPhoto < ApiPhoto
  def url
    self[url] || nil
  end
end

我的目标是把这个放在最后 # /app/models/venue.rb class 场地 < ApplicationRecord has_one :google_api has_one :other_api has_many :apis has_many :照片 :through => :apis 结束

# /app/views/venues/show.html.erb
<%# ... %>
@venue.photos.each do |photo|
   photo.url
end
<%# ... %>

而 photo.url 会根据 api 给我正确的格式。

随着我对集成的深入,似乎有些不对劲。如果我必须 Api has_many :google_api_photo 那么每个 Api 都会有 GoogleApi 照片。什么对我来说没有意义。

知道我应该如何从这里开始吗?

我想我解决了。

通过将此添加到 venue.rb

has_many :apis, :dependent => :destroy
has_many :photos, :through => :apis, :source => :api_photos

通过调用venue.photos[0].url根据ApiPhoto

type字段调用对Class