我正在使用命名范围来处理一些过滤操作,并且日志显示一切正常,除了在应用程序找到正确的数据之后,它会忽略它找到的内容,只列出一个 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 %>