Ransack:has_many通过协会期待param抛出错误

时间:2015-07-29 13:50:55

标签: ruby-on-rails ransack

这是我的模型的一般近似,通过使用需要参数的范围来使用has_many

class GlobalCompany
  has_many :locations
  has_many :global_company_forms, :through => :locations
end

class Location
  belongs_to :global_company
  has_one :global_company_form
end

class Company
  belongs_to :global_company
  belongs_to :subdomain

  has_many :global_company_forms, ->(company) { for_company(company) }, :through => :global_company
end

class GlobalCompanyForm
  belongs_to :location
  belongs_to :subdomain_form

  scope :for_company, ->(company) {where(:subdomain_form_id => company.subdomain.subdomain_form.id)}
end

class SubdomainForm
  belongs_to :subdomain
end

Company.ransack(q).result将抛出:

NoMethodError: undefined method `subdomain' for #<ActiveRecord::Associations::JoinDependency::JoinAssociation:0x007fbd227f0850>

当ransack访问该关联时,将其作为“公司”传递给关联,而不是公司记录,因此无方法

我环顾四周,但没有找到任何类似的例子,我无法弄清楚如何进行搜索,尊重这种类型的关联/范围。该协会本身在洗劫之外工作正常。

1 个答案:

答案 0 :(得分:2)

在指定要从中绘制结果的表时,您只需在控制器中手动执行连接:

@q= GlobalCompany.joins(:location, :global_company_forum).ransack(params[:q])

设置表单时,请使用:

<%=f.search_field :global_company_forum_name_contains%>

结果,只需将模型链接在一起:

global_company_instance.location.global_company_forum.name

我是根据讨论here开发的。