Как получить запись ActiveRecord по виртуальному атрибуту? - PullRequest
0 голосов
/ 16 марта 2012

В Rails 3 как я могу получить запись, посмотрев на виртуальный атрибут?У меня есть столбец name и slug, которые вносят в него простую модификацию (см. Код ниже).Как я могу сделать «обратный поиск» от slug до 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_slug в консоли Rails, у меня появляется ошибка Unknown key: slug.

Этот вопрос кажется похожим, но я не уверен, совпадает ли он с моей проблемой.Буду признателен за понимание и помощь!

1 Ответ

1 голос
/ 16 марта 2012

Так как слаг в базе данных не существует, вы не можете сначала запросить его. Что вам нужно сделать, это поиск по названию. Но для того, чтобы сделать это, ваше отображение «имя к слизняку» должно быть обратимым. Вы должны быть в состоянии сделать

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...