2017-01-05 3 views
0

私のレール4のアプリケーションが虚栄心のURLを持つためには、多形スラッグテーブル(id、url)があります。テーブルフィールドの値の一意性をチェックする方法とuniqをuniqにする方法

class Article < ActiveRecord::Base 
    has_many :slugs, as: :sluggable, dependent: :destroy 
    after_save :create_slug 

    def create_slug 
     return if !url_changed? || url == slugs.last.try(:url) 
     #re-use old slugs 
     previous = slugs.where('lower(url) = ?', url.downcase) 
     previous.delete_all 
     slugs.create!(url: url) 
    end 
end 

@のarticle.urlが現在コントローラに設定されている:私はスラグを作成するには、次のしている私の記事のモデルに続いて

@article.url = @article.title.parameterize 

がない限りこれは本当によく働きますこれは、タイトルが既に使用されているアーティクルが作成されていることを意味します。その場合はレールエラーPG::UniqueViolation: ERROR: duplicate key value violates unique constraint

私はが最初に値が存在するかどうかを確認する必要があると思っていますが、値が存在する場合は-1または-2などを追加してください。 urlが一意になるまでurlの終わりまで。これは正しいと思いますか?このシナリオを処理/コードする最良の方法は何ですか?

おかげ

答えて

-1

古い振る舞いは特殊なmoduleで実装されました。しかし、現時点ではまだリリースされていません。したがって、古い動作を復元したい場合は、GithubのGemfileにあるfriebdly_idを切り替えて、sequentially_sluggedをモジュールリストに追加することができます。

あなたがどんな宝石のために移動したくない場合は、あなたのための最も簡単な方法は、URLのよりよい作るための以下のコードを使用している....

def to_param 
    "#{id}-#{slug}" 
end 

あなたは、メソッドのコードを更新することができますし、いつでもあなたが望むものを作ることができます。

+0

興味深い。私はその宝石を使用していません。それは本当にすべてのものですか? – AnApprentice

+0

ねえ、あなたがそれを使用していないなら、私はそれに移動することを提案します。それはあなたのために多くの時間を節約します。 –

関連する問題