Rails has_many STI与子STI

时间:2017-12-25 13:23:21

标签: ruby-on-rails ruby has-many belongs-to sti

我认为它更像是一个"模型设计"问题而非铁路问题。

为了清楚起见,这里是业务逻辑:我和Venues,我想实现多个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 / model /venue.rb     类地点&lt; ApplicationRecord       has_one:google_api       has_one:other_api       has_many:apis       has_many:photos:through =&gt; :蜜蜂     端

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

而photo.url会给我正确的格式,这取决于api。

随着我在整合方面的深入,似乎有些不对劲。如果我必须Api has_many :google_api_photo,那么每个Api都会有GoogleApiPhoto。什么对我没有意义。

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

1 个答案:

答案 0 :(得分:0)

我想我解决了它。

将此添加到Baz

response

致电venue.rb,根据has_many :apis, :dependent => :destroy has_many :photos, :through => :apis, :source => :api_photos

venue.photos[0].url字段拨打正确的班级