0

#find在将ActiveRecord 中的两种方法的使用压缩为单个语句和 SQL 查询时,我有点脑筋急转弯。

我有一条 Sinatra 路线,其中提供了父母和子女记录的 slug(父母有很多孩子)。Atm 我首先通过#find_by_slug电话找到父母,然后#find_by_slug在匹配的父母协会中再次找到孩子。

这导致了两个 SQL 查询,在我看来应该可以很容易地压缩为一个......只是我无法弄清楚 ActiveRecord 是如何实现的。

模型、路线和 AR 日志如下。使用 ActiveRecord 3.2

编辑

我意识到我需要澄清所要求的确切结果(我在当天很晚才写这个)。我只需要Episodeatm,但我得到了Show第一个才能到达Episode. 我只需要Episode并且认为他们必须是一种在不添加额外行并获得Show第一行的情况下获得该对象的方法。

模型

class Show < ActiveRecord::Base
  has_many :episodes
end

class Episode < ActiveRecord::Base
  belongs_to :show
end

西纳特拉路线

get "/:show_slug/:episode_slug" do
  @show = Show.find_by_slug show_slug
  @episode = @show.episodes.find_by_slug episode_slug

  render_template :"show/show"
end

活动记录日志

Show Load (1.0ms)  SELECT `shows`.* FROM `shows` WHERE `shows`.`slug` = 'the-show-slug' LIMIT 1
Episode Load (1.0ms)  SELECT `show_episodes`.* FROM `show_episodes` WHERE `show_episodes`.`show_id` = 1 AND `show_episodes`.`slug` = 'episode-21' LIMIT 1
4

1 回答 1

1

如果你只需要@episode,你可以做

@episode = Episode.joins(:shows).where('shows.slug = ?', show_slug).where('episodes.slug = ?', episode_slug).first

如果你还需要@show,你必须有两个查询。

于 2013-05-30T00:13:22.437 回答