我有两个模型 -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 中有两条记录,它们是:
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 和 BannerType 表(Rails 约定表示为复数)。如果我尝试这是我得到的错误:banner_type
banner_types
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")
?
很想听听你的想法。
谢谢。