0

Rails 3 では、仮想属性を検索してレコードを取得するにはどうすればよいですか? name列があり、それにslug簡単な変更を加えます (以下のコードを参照)。slugto で「逆引き」を行うにはどうすればよいnameですか?

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

find_by_slugRails コンソールで試してみると、Unknown key: slugエラーが表示されます。

この質問は似ているようですが、私の問題と同じかどうかはわかりません。洞察と助けをいただければ幸いです。

4

1 に答える 1

1

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

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

スラッグが与えられた場合、その名前が何であるかがわかります。次に、find_by_nameを実行できます。今あなたのスラグ変換

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

「スペースのみがあり、すべての最初の文字が大文字になっている」など、共有していない暗黙の情報がない限り、元に戻すことはできません。したがって、これを行うことはできません。これを仮想属性ではなく通常の属性にすることをお勧めします。変換が可逆的である場合は、使用する必要があります

find_by_name(convert_to_name(slug))
于 2012-03-16T02:57:21.517 に答える