と の 2 つのモデルがBanner
ありBannerType
ます。
それらのスキーマは次のようになります。
バナー
# 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
バナータイプ
# 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
とBannerType has_many :banners
BannerType には次の 2 つのレコードがあります。
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">]
そのタイプのすべてのバナーを検索するクエリを実行したい場合は、次のFeatured
ようにすることができます。
Banner.joins(:banner_type).where("banner_types.name = ?", 'Featured')
でクエリを実行することもできますが、banner_type_id => 1
それはこの特定の質問に密接に関連しています。
その声明を分析すると、私には少し混乱することがいくつかあります。
Banner.join(:banner_type)
それがSQLメソッド名でNoMethodError: undefined method 'join' for #<Class:0x007fb6882909f0>
あるのにRailsメソッドが呼び出されないのはなぜですか?join
テーブル
Banner.joins(:banner_type)
名banner_type
がbanner_types
. Banner & BannerType テーブル (Rails の慣例では複数形として示されています) に参加していませんか? これを試してみるBanner.joins(:banner_types)
と、次のエラーが表示されます。Banner.joins(:banner_types) ActiveRecord::ConfigurationError: Association named 'banner_types' was not found; perhaps you misspelled it?
なぜ
where
句が必要であり、必要banner_types
でないのですかbanner_type
(つまり、複数形のバージョン - つまり、joins
メソッドで使用される記号ではなくテーブル名ですか?両方の場所でテーブル名を使用するか、両方の場所でシンボル名を使用すると、より直感的になるようです。少なくとも、一貫性を保つためです。アソシエーションを介して動的検索を実行できないのはなぜ
Banner.find_by_banner_type_name("Featured")
ですか?
ご意見をお待ちしております。
ありがとう。