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

当我在 Rails 控制台中尝试find_by_slug时,我得到了一个Unknown key: slug错误。

这个问题似乎很相似,但我不确定它是否与我的问题相同。我会很感激一些见解和帮助!

4

1 回答 1

1

由于数据库中不存在 slug ,因此您无法先查询它。您需要做的是搜索名称。但为了做到这一点,您的“名称到 slug”映射需要是可逆的。你需要能够做到

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

因此,给定一个蛞蝓,你知道它的名字是什么 - 然后你可以做 find_by_name。现在你的slug转换

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

是不可逆的,除非您没有与我们分享一些隐含的信息,例如“只有空格并且每个首字母都大写”。所以它无法完成,你最好将其设为常规属性而不是虚拟属性。如果您的转换是可逆的,那么您只需要使用

find_by_name(convert_to_name(slug))
于 2012-03-16T02:57:21.517 回答