Dekonstruktion Schienen .Verknüpfungen & .wo Methoden

Ich habe zwei Modelle - Banner und BannerType.

Ihre schema sieht wie folgt aus:

Banner

# Table name: banners
#
#  id             :integer          not null, primary key
#  name           :string(255)
#  image          :string(255)
#  created_at     :datetime         not null
#  updated_at     :datetime         not null
#  url            :string(255)
#  banner_type_id :integer

BannerType

# Table name: banner_types
#
#  id         :integer          not null, primary key
#  name       :string(255)
#  created_at :datetime         not null
#  updated_at :datetime         not null

Banner belongs_to :banner_type und BannerType has_many :banners

Habe ich zwei Datensätze in BannerType, sind diese:

BannerType.all
  BannerType Load (0.3ms)  SELECT "banner_types".* FROM "banner_types" 
 => [#<BannerType id: 1, name: "Featured", created_at: "2012-12-17 04:35:24", updated_at: "2012-12-17 04:35:24">, #<BannerType id: 2, name: "Side", created_at: "2012-12-17 04:35:40", updated_at: "2012-12-17 04:35:40">] 

Wenn dann will ich eine Abfrage, um herauszufinden, alle Banner der Typ Featured kann ich tun so etwas wie dieses:

Banner.joins(:banner_type).where("banner_types.name = ?", 'Featured')

Ich weiß, ich könnte auch Abfragen, indem Sie die banner_type_id => 1 aber das ist germane zu diesem speziellen Frage.

Wenn wir brechen diese Aussage, es gibt ein paar Dinge, die sind ein bisschen verwirrend für mich.

  1. Banner.join(:banner_type) - erzeugen würde NoMethodError: undefined method 'join' for #<Class:0x007fb6882909f0> Warum gibt es keine Schienen Methode namens join wenn das der SQL-Methode name?
  2. Warum Tue ich Banner.joins(:banner_type) d.h. der singular banner_type wenn der name der Tabelle ist banner_types. Bin ich nicht an die Banner - & BannerType Tabellen (die Rails Konventionen bezeichnen als plural). Wenn ich versuche Banner.joins(:banner_types) dies ist die Fehlermeldung, die ich bekomme:

    Banner.joins(:banner_types)
    ActiveRecord::ConfigurationError: Association named 'banner_types' was not found; perhaps you misspelled it?

  3. Warum die where - Klausel müssen banner_types und nicht banner_type (d.h. der pluralisiert version - also der name der Tabelle und nicht das symbol in der joins Methode? Es scheint, es wäre intuitiver, wenn Sie die Namen der Tabellen sind in beiden Orten oder verwenden Sie den symbol-Namen, die in beiden Orten. Wenn zumindest aus Gründen der Konsistenz verwenden.
  4. Warum kann ich das nicht dynamische Suche über Verbände - D. H. es wäre schön, wenn ich könnte Banner.find_by_banner_type_name("Featured")?

Würde lieben, Ihre Gedanken zu hören.

Dank.

InformationsquelleAutor marcamillion | 2012-12-17

Schreibe einen Kommentar