Как установить полиморфную модель Rails с friendly_id и историей - PullRequest
0 голосов
/ 13 марта 2019

У меня есть Модель компании и 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

1 Ответ

0 голосов
/ 14 марта 2019

Конфликт неоднозначных столбцов в базе данных будет разрешен при изменении медленного имени полиморфного.Friendly_id также используйте sluggable_id и sluggable_type для истории.

class Seo < ApplicationRecord

  extend FriendlyId
  
  ... 
  belongs_to :sluggable, polymorphic: true
  #this line was problem
  

  ...

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...