这是我的模型的一般近似,通过使用需要参数的范围来使用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访问该关联时,将其作为“公司”传递给关联,而不是公司记录,因此无方法
我环顾四周,但没有找到任何类似的例子,我无法弄清楚如何进行搜索,尊重这种类型的关联/范围。该协会本身在洗劫之外工作正常。
答案 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开发的。