La Déconstruction Des Rails .les jointures & .lorsque les méthodes

J'ai deux modèles - Banner et BannerType.

Leur schéma ressemble à ceci:

Bannière

# 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 et BannerType has_many :banners

J'ai deux dossiers dans BannerType qui sont ces:

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">] 

Si je veux faire une requête pour trouver toutes les bannières de type Featured je peux faire quelque chose comme ceci:

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

Je sais que je pourrais aussi faire la requête par le banner_type_id => 1 mais se rapportant à cette question particulière.

Si on décompose cette déclaration, il y a quelques choses qui sont un peu confus pour moi.

  1. Banner.join(:banner_type) - serait de générer des NoMethodError: undefined method 'join' for #<Class:0x007fb6882909f0> Pourquoi il n'y a pas de Rails méthode appelée join lorsque c'est le SQL, le nom de la méthode?
  2. Pourquoi dois-je faire Banner.joins(:banner_type) c'est à dire le singulier banner_type lorsque le nom de la table est banner_types. Je ne suis pas à rejoindre la Bannière & BannerType tables (qui Rails de conventions de désigner comme au pluriel). Si j'essaie Banner.joins(:banner_types) c'est l'erreur que j'obtiens:

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

  3. Pourquoi le where de la clause du besoin banner_types et pas banner_type (c'est à dire la marque du pluriel version - c'est à dire le nom de la table et non pas le symbole utilisé dans le joins méthode? Il semble qu'il serait plus intuitif si vous utilisez la table des noms de lieux ou d'utiliser les noms de symbole dans les deux endroits. Si, à tout le moins, à des fins de cohérence.
  4. Pourquoi ne puis-je pas faire dynamique, comment trouver via des associations - c'est à dire qu'il serait bien si je pouvais faire Banner.find_by_banner_type_name("Featured")?

Aimerais entendre vos pensées.

Grâce.

OriginalL'auteur marcamillion | 2012-12-17