如何通过虚拟属性获取ActiveRecord记录?

时间:2012-03-16 01:54:08

标签: ruby-on-rails-3 activerecord virtual-attribute

在Rails 3中,如何通过查找虚拟属性来检索记录?我有name列和slug对其进行简单修改(请参阅下面的代码)。如何slugname进行“反向查询”?

我正在尝试为下面的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错误。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

find_by_name(convert_to_name(slug))