名前付きスコープを使用していくつかのフィルタリングアクションを処理していますが、ログにはすべてが完全に機能していることが示されています。ただし、アプリが実行されて正しいデータが検出された後、検出されたデータは無視され、代わりにfind.allが一覧表示されます。フィルタリングされた結果。詳細はこちらです。
ユーザー、マーケット、スケジュールの3つのモデルがあります。
ユーザーhas_many :schedules
ユーザーhas_many :markets, :through => :schedules
マーケットhas_many :schedules
マーケットhas_many :users, :through => :schedules
スケジュールbelongs_to :user
スケジュールbelongs_to :market
各市場の「表示」ページには、その市場で商品を販売しているユーザーを表示します。また、そのようなユーザーが市場に出ている曜日も表示します。このデータは、結合モデル(つまりスケジュール)に含まれています。
マーケットページでは、ユーザーがマーケットにいる曜日によるユーザーのフィルタリングをサポートする必要があります。
私のマーケットコントローラーには、次のものがあります。
def show
@market = Market.find(params[:id])
@users = @market.users.filter_marketdate(params[:filter])
end
私のマーケットモデルでは、これがあります:
def self.filter_marketdate(filter)
case filter
when 'monday' then monday.all
else find(:all)
end
end
私のユーザーモデルでは、これがあります:
named_scope :monday, :include => :schedules, :conditions => {'schedules.monday' => true }
と
def self.filter_marketdate(filter)
case filter
when 'monday' then monday.all
else find(:all)
end
end
Marketsのショービューでは、次のようになっています。
<%= link_to_unless_current "All", :filter => 'all' %>
<%= link_to_unless_current "Mon", :filter => 'monday' %>
<% @market.schedules.each do |c| %>
<%= link_to c.user.name, c.user %>
<% end %>
これが奇妙な部分です。以下は、月曜日のフィルターを選択したときのログ出力です。出力の[スケジュールの選択]行を見ると、クエリが限られた数のユーザーIDを検出していることがわかります。実際、これらは、フィルタリングされたクエリに対して表示したい正しいユーザーIDです。私が理解していない部分は、アプリがクエリを完全に実行した後、フィルタリングされた結果だけでなく、すべてのユーザーをロードしてロードすることです。何が欠けているのかわかりません。
Processing MarketsController#show (for ip at 2009-09-21 05:19:25) [GET]
Parameters: {"id"=>"1", "filter"=>"monday"}
Market Load (0.8ms) SELECT * FROM "markets" WHERE ("markets"."id" = 1)
User Load (7.3ms) SELECT "users".* FROM "users" INNER JOIN "schedules" ON "users".id = "schedules".user_id WHERE ((("schedules".market_id = 1)) AND ("schedules"."monday" = 't'))
Schedule Load (4.3ms) SELECT "schedules".* FROM "schedules" WHERE ("schedules".user_id IN (16,23,25,30,39,61,73,75,85,95,97,111,112,116,121,123,126,134,136,145,160,165,171,188,189))
Rendering template within layouts/application
Rendering markets/show
Schedule Load (14.3ms) SELECT * FROM "schedules" WHERE ("schedules".market_id = 1)
User Load (0.8ms) SELECT * FROM "users" WHERE ("users"."id" = 2)
User Load (0.8ms) SELECT * FROM "users" WHERE ("users"."id" = 8)
さらに、この特定の市場に接続しているすべてのユーザーを一覧表示し、基本的にfind.allを実行します。
アップデート
以下のブラッドのコメントに応えて、マーケット/ショービューのコードを次のように変更しようとしましたが、同じ結果が得られました。問題がここのどこかにあることに同意しますが、それを解決する方法を完全に理解することはできません。
<%= link_to_unless_current "All", :filter => 'all' %>
<%= link_to_unless_current "Mon", :filter => 'monday' %>
<% @market.users.each do |user| %>
<%= link_to user.name, user %>
<% end %>