фильтрация проблем по нескольким моделям - PullRequest
2 голосов
/ 29 декабря 2011

итоги: в основном, я хочу, чтобы пользователь вводил заголовок партера для фильтрации списка распределений.Один дистрибутив имеет один профиль, но один партнер имеет много дистрибутивов.Таким образом, если кто-то введет название одного партнера в форму поиска.Это соответствовало бы нескольким идентификаторам распределения (посредством нескольких идентификаторов match_profile).

Я должен описать три рассматриваемые модели:

distribution:
  belongs_to :matching_profile, :counter_cache => true

matching_profile:
  belongs_to :partner

partner:
  has_many :matching_profiles

Мне нужно получить доступ к partner.title черезмодель распределения.

я могу сделать это в SQL: select d.* from distributions d join matching_profiles m on d.matching_profile_id = m.id join partners p on m.partner_id = p.id where p.title in ( 'TITLE' ) / summary

ОБНОВЛЕНИЕ: здесь, по сути, это то, что я хотел бы сделать.Хотя некоторые пробелы отсутствуют ... Пожалуйста, помогите!

в моем контроллере у меня есть:

@search = Distribution.workflow.order(sort_column + " " + sort_direction).search(params[:traits_searchable_search])

в представлении, которое я имею:

<%= form_for @search, :url => url_for(:controller => params[:controller], :action => params[:action]), :html => {id => "distribution_workflow",:method => :get} do |f| %>

 <div class="form-block mrl mbm mtm">
      <%= f.label 'matching_profile.partner.title_equal', "Partner" %>
      <%= f.select @search.where('matching_profile_id in (select id from matching_profiles where partner_id in (select id from partners where title in (?)))'), Partner.select(:title), :include_blank => " " %>
    </div>

the fЧасть .select - это то, что неверно, но я думаю, что ИДЕЯ того, что я пытаюсь сделать, отражена здесь.Я просто не знаю, КАК это сделать./ update

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

В настоящее время я пытался сделать это, добавив еще одно search_scope

search_scopes :equal   => [:status, 'matching_profile.partner.title'] #obviously very wrong

обновление: Iтакже попробовал это:

search_scopes :equal   => [:status, 'distributions.matching_profile.partner.title']

это не дает мне ошибку, но не фильтрует также.Шаг в правильном направлении?/ update

но я получаю сообщение об ошибке, потому что я не могу "прыгнуть" две таблицы, чтобы добраться до заголовка.Я вижу это в сообщении об ошибке:

AND (matching_profile.partner.title = 'PARTNER_TITLE')

, конечно, это неправильно, потому что нет поля match_profile, только match_profile_id.

Я не уверен, что лучший способидти об этом.Любой совет приветствуется.

1 Ответ

0 голосов
/ 30 декабря 2011

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

    unless options[:in].blank?
      [options[:in]].flatten.each do |field|
        scope "#{field}_in", lambda {|value| Rails.logger.info('value: ' + value.to_s)
        vals = []
        value.each do |v|
          vals << v.split(',') unless v.blank? || v.nil?
        end
        {:conditions => ["#{table_names(field)}#{field} in (?)", vals.flatten ]}}
      end
    end

затем в своей модели распространения я добавил:

search_scopes :in    => [:matching_profile_id]

и, наконец, на мой взгляд, я мог бы сделать это:

<div class="form-block mrl mbm mtm">
  <%= f.label :matching_profile_id_in, "Partner" %>
  <%= f.select :matching_profile_id_in, Partner.all.map { |p| [p.title, MatchingProfile.find_all_by_partner_id(p.id).map {|m| m.id}.join(',')]}, {:include_blank => " "}, {:multiple => true}  %>
</div>

и контроллер волшебным образом остается прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...