У меня две модели - 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
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
и BannerType has_many :banners
У меня есть две записи в BannerType:
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)
- сгенерируетNoMethodError: undefined method 'join' for #<Class:0x007fb6882909f0>
Почему нет метода Rails, называемогоjoin
, если это имя метода SQL? -
Почему я делаю
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")
?
Хотелось бы услышать ваши мысли.
Спасибо.