使用 Ransacker 过滤关系
Using Ransacker to filter through relations
我的 rails 应用程序中有以下模型实体:
class Artist < ActiveRecord::Base
has_many :albums
end
class Album < ActiveRecord::Base
belongs_to :artist
has_many :tracks
end
class Track < ActiveRecord::Base
belongs_to :album
end
我正在尝试在相册实体的索引视图中实现一个搜索表单,我需要 select 所有 artist.name 以我的搜索参数开头的相册。我在处理直接模型搜索方面取得了成功,但这种情况下,必须验证 select 子元素的父属性,这让人有些头疼。
我已经阅读了 Ransacker 文档,但没有找到任何相关内容:(
为了以一般方式解决这个问题,我创建了一个文件 _search.html.slim,其中包含 "general search logic",允许 "simple" 搜索(无关联)和复杂搜索(有协会):
= search_form_for @search, url: request.original_url do |f|
= f.condition_fields do |c|
.field
= c.attribute_fields do |a|
- if local_assigns.has_key? :associations
= a.attribute_select associations: associations
- else
= a.attribute_select
= c.predicate_select compounds: false, only: [:cont, :not_cont, :eq, :lteq, :gteq, :lt, :gt]
= c.value_fields do |v|
= v.text_field :value
.form-actions
= f.submit 'Search', class: 'btn btn-primary'
我在索引文件中将其用作
= render 'search', associations: [:artist]
传递我要搜索的关联,或者就像
= render 'search'
如果没有关联
我的控制器看起来像
def index
@search = @albums.includes(:artist).search(params[:q])
@albums = @search.result(distinct: true).paginate(per_page: 10, page: params[:page])
@search.build_condition
end
我的 rails 应用程序中有以下模型实体:
class Artist < ActiveRecord::Base
has_many :albums
end
class Album < ActiveRecord::Base
belongs_to :artist
has_many :tracks
end
class Track < ActiveRecord::Base
belongs_to :album
end
我正在尝试在相册实体的索引视图中实现一个搜索表单,我需要 select 所有 artist.name 以我的搜索参数开头的相册。我在处理直接模型搜索方面取得了成功,但这种情况下,必须验证 select 子元素的父属性,这让人有些头疼。
我已经阅读了 Ransacker 文档,但没有找到任何相关内容:(
为了以一般方式解决这个问题,我创建了一个文件 _search.html.slim,其中包含 "general search logic",允许 "simple" 搜索(无关联)和复杂搜索(有协会):
= search_form_for @search, url: request.original_url do |f|
= f.condition_fields do |c|
.field
= c.attribute_fields do |a|
- if local_assigns.has_key? :associations
= a.attribute_select associations: associations
- else
= a.attribute_select
= c.predicate_select compounds: false, only: [:cont, :not_cont, :eq, :lteq, :gteq, :lt, :gt]
= c.value_fields do |v|
= v.text_field :value
.form-actions
= f.submit 'Search', class: 'btn btn-primary'
我在索引文件中将其用作
= render 'search', associations: [:artist]
传递我要搜索的关联,或者就像
= render 'search'
如果没有关联
我的控制器看起来像
def index
@search = @albums.includes(:artist).search(params[:q])
@albums = @search.result(distinct: true).paginate(per_page: 10, page: params[:page])
@search.build_condition
end