在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
当我在Rails控制台中尝试find_by_slug
时,我遇到了Unknown key: slug
错误。
This问题似乎相似,但我不确定它是否与我的问题相同。我很感激一些见解和帮助!
答案 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))