0

#findActiveRecordでの 2 つのメソッドの使用を 1 つのステートメントと SQL クエリに凝縮することになると、少し脳がブロックされます。

親レコードと子レコードの両方のスラッグが提供される Sinatra ルートがあります (親には多くの子があります)。Atm 最初に#find_by_slug呼び出しで親を見つけ、次に#find_by_slug一致した親の関連付けで子を見つけます。

これにより、2 つの SQL クエリが生成されますが、私の考えでは、簡単に 1 つに凝縮できるはずです... ActiveRecord でそれがどのように達成されるかは、私にはわかりません。

以下モデル、ルート、ARログ。ActiveRecord 3.2 の使用

編集

必要な正確な結果を明確にする必要があることに気付きました (私はこれを 1 日の非常に遅い時間に書きます)。必要なのは だけですが、に到達するためEpisodeShow最初の順序で ATM を取得してい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

ActiveRecord ログ

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、2 つのクエリが必要です。

于 2013-05-30T00:13:22.437 に答える