摘要: 基本上,我希望用户输入一个parter的标题来过滤分发列表。一个发行版有一个配置文件,但一个合作伙伴有许多发行版。因此,如果有人将一个合作伙伴标题放入搜索表单中。这将对应于多个分发ID(通过多个matching_profile id)。
我应该描述这三个模型:
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>
f.select部分是不正确的,但我认为我正在尝试做的IDEA在这里被捕获。我只是不知道怎么做。 /更新
我在网页上展示报告,我需要允许用户根据合作伙伴的标题过滤掉哪些行可用。然而,合作伙伴的标题不在我为其创建表单的模型中。该表单用于分发模型,该模型引用了matching_profile,其中包含对partner的引用。合作伙伴表是包含我要过滤的标题的表。
目前,我尝试通过添加另一个search_scope
search_scopes :equal => [:status, 'matching_profile.partner.title'] #obviously very wrong
更新:我也试过了:
search_scopes :equal => [:status, 'distributions.matching_profile.partner.title']
这不会给我一个错误,但也不会过滤。在正确方向迈出的一步? /更新
但我收到一个错误,因为我似乎无法“跳”两个表来获得标题。我在错误消息中看到了这一点:
AND (matching_profile.partner.title = 'PARTNER_TITLE')
当然,这是错误的,因为没有matching_profile字段,只有matching_profile_id。
我不确定最好的方法是什么。任何建议都表示赞赏。
答案 0 :(得分:0)
好吧,我最终要做的是在我的可搜索特性中添加一个新选项以允许:在搜索中。从那里我不得不做一些重新摇晃以使序列化愉快,但是一旦我意识到我可以扩展可搜索的特性,它是相对简单的。我补充说:
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>
并且控制器神奇地保持不变。