Wie kann ich in Rails 3 einen Datensatz abrufen, indem ich nach einem virtuellen Attribut schaue? Ich habe ein name
Spalte und a slug
das macht eine einfache Modifikation (siehe Code unten). Wie kann ich einen "Reverse Lookup" von machen slug
zu name
?
Ich versuche den richtigen Code für die find_by_slug
Methode unten:
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
Wenn ich es versuche find_by_slug
In der Rails Konsole habe ich eine gegeben Unknown key: slug
Error.
Dies Frage scheint ähnlich, aber ich bin nicht sicher, ob es das gleiche wie mein Problem ist. Ich würde etwas Einsicht und Hilfe schätzen!
Antworten:
1 für die Antwort № 1Da slug nicht in der Datenbank vorhanden istSie können nicht zuerst danach fragen. Was Sie tun müssen, ist die Suche nach dem Namen. Aber um dies zu tun, muss Ihre Zuordnung von "Name zu Slug" reversibel sein. Sie müssen in der Lage sein
name = "San Francisco"
slug = convert_to_slug(name) #san-francisco
name == convert_to_name(slug) #true
Wenn Sie also einen Slug erhalten, wissen Sie, wie er heißt - dann können Sie find_by_name. Jetzt Ihre Slug-Umwandlung
downcase.gsub(/s/, "-")
ist nicht umkehrbar, es sei denn, einige implizitInformationen, die Sie nicht mit uns teilen, z. B. "Es gibt nur Leerzeichen und jeder erste Buchstabe wird groß geschrieben". Es kann also nicht "gemacht werden", und Sie sollten dieses Attribut am besten als reguläres Attribut und nicht als virtuelles Attribut definieren Ihre Konvertierung ist reversibel, dann müssen Sie nur noch verwenden
find_by_name(convert_to_name(slug))