/ / Як отримати запис ActiveRecord за віртуальним атрибутом? - ruby-on-rails-3, activerecord, virtual-attribute

Як отримати запис ActiveRecord за віртуальним атрибутом? - ruby-on-rail-3, activerecord, virtual-атрибут

Як в Rails 3 я можу отримати запис, переглянувши віртуальний атрибут? Я маю name стовпчик і a 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

Оскільки 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))