0

名前付きスコープを使用していくつかのフィルタリングアクションを処理していますが、ログにはすべてが完全に機能していることが示されています。ただし、アプリが実行されて正しいデータが検出された後、検出されたデータは無視され、代わりに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 %>
4

2 に答える 2

0

すべきではない:

#Market.rb
has_many :users, :through => :schedules

これに加えて、おそらくこのプラグインはあなたを助けます:

http://github.com/ntalbott/query_trace

各SQLステートメントとそれがどこから来たのかについてのフィードバックを提供します。

fe:

Before:

  Schedule Load (0.023687)   SELECT * FROM schedules WHERE (schedules.id = 3) LIMIT 1
  Resource Load (0.001076)   SELECT * FROM resources WHERE (resources.id = 328) LIMIT 1
  Schedule Load (0.011488)   SELECT * FROM schedules WHERE (schedules.id = 3) LIMIT 1
  Resource Load (0.022471)   SELECT * FROM resources WHERE (resources.id = 328) LIMIT 1


After:

  Schedule Load (0.023687)   SELECT * FROM schedules WHERE (schedules.id = 3) LIMIT 1
    app/models/available_work.rb:50:in `study_method'
    app/helpers/plan_helper.rb:4:in `work_description'
    app/views/plan/_resource_schedule.rhtml:27:in `_run_rhtml_plan__resource_schedule'
    app/views/plan/_resource_schedule.rhtml:24:in `_run_rhtml_plan__resource_schedule'
    app/views/plan/_schedule_listing.rhtml:5:in `_run_rhtml_plan__schedule_listing'
    app/views/plan/_schedule_listing.rhtml:3:in `_run_rhtml_plan__schedule_listing'
    app/views/plan/_schedule_listing.rhtml:1:in `_run_rhtml_plan__schedule_listing'
    app/views/plan/index.rhtml:6:in `_run_rhtml_plan_index'
    vendor/plugins/textmate_footnotes/lib/textmate_footnotes.rb:60:in `render'
  Resource Load (0.001076)   SELECT * FROM resources WHERE (resources.id = 328) LIMIT 1
    app/models/available_work.rb:54:in `div_type'
    app/helpers/plan_helper.rb:6:in `work_description'
    app/views/plan/_resource_schedule.rhtml:27:in `_run_rhtml_plan__resource_schedule'
    app/views/plan/_resource_schedule.rhtml:24:in `_run_rhtml_plan__resource_schedule'
    app/views/plan/_schedule_listing.rhtml:5:in `_run_rhtml_plan__schedule_listing'
    app/views/plan/_schedule_listing.rhtml:3:in `_run_rhtml_plan__schedule_listing'
    app/views/plan/_schedule_listing.rhtml:1:in `_run_rhtml_plan__schedule_listing'
    app/views/plan/index.rhtml:6:in `_run_rhtml_plan_index'
    vendor/plugins/textmate_footnotes/lib/textmate_footnotes.rb:60:in `render'

アップデート:

あなたは電話する必要があります

<%= link_to_unless_current "All", :filter => 'all' %>
<%= link_to_unless_current "Mon", :filter => 'monday' %>    
   <% @users.each do |user| %>
     <%= link_to user.name, user %>
   <% end %>
于 2009-09-21T09:41:41.327 に答える
0

あなたの見解では、設定した@users変数ではなく、各market.scheduleを反復処理しています。実際、表示されているコードでは@usersを使用していません。

于 2009-09-22T02:52:56.347 に答える