Я использую именованные области для обработки некоторых действий фильтрации, и журнал показывает, что все работает отлично, за исключением того, что после того, как приложение выходит и находит правильные данные, оно игнорирует то, что оно нашло, и просто перечисляет результаты поиска. все вместо отфильтрованного результата. Вот подробности.
У меня есть 3 модели: пользователи, рынки и графики.
Пользователь has_many :schedules
Пользователь has_many :markets, :through => :schedules
Рынок has_many :schedules
Рынок has_many :users, :through => :schedules
Расписание belongs_to :user
Расписание belongs_to :market
На странице «Показать» для каждого рынка я показываю пользователей, которые продают вещи на этом рынке. Я также отображаю дни недели, когда такие пользователи на рынке. Эти данные содержатся в модели соединения (то есть в расписаниях).
На странице рынка мне нужно поддерживать фильтрацию пользователей по дням недели, когда пользователь находится на рынке.
В моем контроллере Market у меня есть это:
def show
@market = Market.find(params[:id])
@users = @market.users.filter_marketdate(params[:filter])
end
В моей модели Market у меня это:
def self.filter_marketdate(filter)
case filter
when 'monday' then monday.all
else find(:all)
end
end
В моей модели User, у меня есть это:
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 %>
Вот странная часть. Следующее - мой вывод журнала, когда я выбираю фильтр понедельника. Если вы посмотрите на строку «Выбрать расписание» вывода, вы увидите, что запрос находит ограниченное количество идентификаторов пользователей. На самом деле это правильные идентификаторы пользователей, которые я хочу отобразить для моего фильтрованного запроса. Часть, которую я не понимаю, состоит в том, что после того, как приложение выполняет запрос идеально, оно затем загружает всех пользователей, а не только отфильтрованные результаты. Я не уверен, что мне не хватает.
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.
UPDATE
В ответ на комментарий Брэда, приведенный ниже, я попытался изменить код в моем представлении market / show на следующий, но получил тот же результат. Я согласен, что проблема где-то здесь, но я не могу понять, как ее решить.
<%= 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 %>