2012-03-16 16 views
0

Rails 3では、仮想属性を参照してレコードを取得するにはどうすればよいですか?私はnameの列とslugを持っていますが、これは簡単な変更です(下記のコードを参照してください)。 slugnameで「逆引き検索」を実行するにはどうすればよいですか?仮想属性でActiveRecordレコードを取得する方法は?

私は以下のfind_by_slug方法のための右のコードを見つけようとしている:私は私がUnknown key: slugエラーを与えていますRailsのコンソールでfind_by_slugをしようとすると

class Brand < ActiveRecord::Base 
    has_many :sale_items 
    validates :name, :uniqueness => true 

    def slug 
    self.name.downcase.gsub(/\s/, '-') 
    end 

    def self.find_by_slug(given_slug) 
    first(slug: given_slug) 
    end 
end 

を。

This質問は類似しているようですが、私の問題と同じかどうかはわかりません。私はいくつかの洞察力と助けに感謝します!

答えて

1

データベースにslugが存在しないため、最初にクエリを実行することはできません。あなたがする必要があるのは、名前の検索です。しかし、そうするためには、あなたの「名前からスラッグ」へのマッピングは元に戻す必要があります。あなたがfind_by_nameを行うことができます - あなたは、だから、スラグ、あなたはそれが名前のようになります知っているが与えられ

name = 'San Francisco' 
slug = convert_to_slug(name) #san-francisco 
name == convert_to_name(slug) #true 

を行うことができるようにする必要があります。あなたは私たちと共有していない一部の暗黙の情報がありますしない限り、「そこだけのスペースがあり、すべての最初の文字を大文字に」のような今、あなたのスラグ変換

downcase.gsub(/\s/, '-') 

は、可逆的ではありません。だから、それはできません。あなたはこれを通常の属性にして、仮想的な属性にするのが最善です。いくつかの名前は、ハイフンを持っているし、他の人が単語の間にスペースを持っているので、あなたの変換が可逆的である場合、あなたはちょうどあなたが正しい

find_by_name(convert_to_name(slug)) 
+0

を使用する必要があり、それは可逆的ではありません。私はあなたのアドバイスを受け取り、それを通常の属性にします。 –