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  

在我的市场展示视图中,我有这个:

<%= 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 %>

这是奇怪的部分。以下是我选择星期一过滤器时的日志输出。如果您查看输出的 Select Schedules 行,您可以看到查询正在查找数量有限的用户 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.schedule,而不是您设置的 @users 变量。事实上,您甚至没有在向我们展示的代码中使用 @users。

于 2009-09-22T02:52:56.347 回答
0

那不应该是:

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

除此之外,也许这个插件可以帮助你:

http://github.com/ntalbott/query_trace

它为每个 sql 语句及其来自何处提供反馈。

费:

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 回答