【发布时间】:2012-12-04 06:24:06
【问题描述】:
我有两个模型 - 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)- 会生成NoMethodError: undefined method 'join' for #<Class:0x007fb6882909f0>为什么没有名为join的 Rails 方法,而那是 SQL 方法名称? -
当表名是
banner_types时,为什么我要使用Banner.joins(:banner_type)即单数banner_type。我没有加入 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")就好了?
很想听听你的想法。
谢谢。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 arel