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
我认为这更像是一个 "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