Названная проблема области с ассоциацией "Имеет много через" - PullRequest
0 голосов
/ 21 сентября 2009

Я использую именованные области для обработки некоторых действий фильтрации, и журнал показывает, что все работает отлично, за исключением того, что после того, как приложение выходит и находит правильные данные, оно игнорирует то, что оно нашло, и просто перечисляет результаты поиска. все вместо отфильтрованного результата. Вот подробности.

У меня есть 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 %>

Ответы [ 2 ]

0 голосов
/ 22 сентября 2009

По вашему мнению, вы выполняете итерации по каждому market.schedule, а не по переменной @users, которую вы установили. На самом деле, вы даже не используете @users в коде, который вы нам показываете.

0 голосов
/ 21 сентября 2009

Разве это не должно быть:

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

Кроме этого, возможно, этот плагин поможет вам:

http://github.com/ntalbott/query_trace

Он предоставляет обратную связь для каждого оператора SQL и откуда он берется ..

f.e:.

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'

UPDATE

Вы должны позвонить

<%= link_to_unless_current "All", :filter => 'all' %>
<%= link_to_unless_current "Mon", :filter => 'monday' %>    
   <% @users.each do |user| %>
     <%= link_to user.name, user %>
   <% end %>
...