У меня есть Модель компании и Seo (по ссылке ниже Seo, называемая PublicSlug) с полимофической ассоциацией и озабоченность, похожая на ответ
Совпадение нескольких моделей в одном маршруте Rails с friendly_id
для создания проблемы, и все работает, пока я добавляю: опция истории.
После того, как я обновляю Seo в консоли rails, у меня появляется ошибка
Traceback (most recent call last):
3: from (irb):3
2: from app/models/concerns/sluggable.rb:17:in `touch_seo'
1: from app/models/seo.rb:28:in `update_slug'
ActiveRecord::StatementInvalid (Mysql2::Error: Column 'sluggable_id' in where clause is ambiguous: SELECT 1 AS one FROM `seos` INNER JOIN `friendly_id_slugs` ON `friendly_id_slugs`.`sluggable_id` = `seos`.`id` AND `friendly_id_slugs`.`sluggable_type` = 'Seo' WHERE `seos`.`id` != 10 AND (sluggable_id <> 10) AND `seos`.`slug` = 'san-fransisco2' LIMIT 1)
Как разрешить неоднозначный столбец базы данных в friendly_id с помощью опции: history
models.seo.rb
class Seo < ApplicationRecord
extend FriendlyId
friendly_id :set_candidates, use: [:slugged, :history ]
belongs_to :sluggable, polymorphic: true
validates :slug, presence: true, uniqueness: { case_sensitive: false }
def should_generate_new_friendly_id?
true
#always
end
def update_slug
self.should_generate_new_friendly_id?
self.save!
end
private
def set_candidates
case sluggable_type
when 'Company' then company_candidates
when 'City' then city_candidates
end
end
def company_candidates
[
sluggable.name,
["#{sluggable.name} w mieście #{sluggable.city.name} na ulicy #{sluggable.street}"]
]
end
def city_candidates
[ sluggable.name ]
end
end
модель / company.rb
class Company < ApplicationRecord
include Sluggable
belongs_to :city
end
модель / проблемы / sluggable.rb
module Sluggable
extend ActiveSupport::Concern
included do
before_validation :create_seo
has_one :seo, dependent: :destroy, as: :sluggable
after_update :touch_seo
#delegate :slug, to: :seo, prefix: :setting
#line above is unnecessary
private
def create_seo
self.seo = Seo.new unless seo.present?
end
def touch_seo
self.seo.update_slug
end
end
end