相关疑难解决方法(0)

Ransack,查找具有所有相关记录的记录

我有一个配方模型,其中包含很多成分,每种成分都属于一个项目.在我的高级搜索表单中,我希望用户选择多种成分,让Ransack找到包含用户选择的所有成分的配方.

我尝试了以下搜索字段:

= f.collection_select(:ingredients_item_id_in, Item.all, :id, :name, {}, {multiple: true})
Run Code Online (Sandbox Code Playgroud)

但从逻辑上讲,这会导致显示的所有配方都含有任何选定的成分.

由于一条记录不能包含多个item_id值,因此更改:ingredients_item_id_in:ingredients_item_id_in_all不正确的查询结果.

有关在Ransack中创建此搜索参数的任何想法,还是应该为此创建子查询?

根据要求,我的控制器搜索方法:

  def search
    @q = Recipe.ransack(params[:q])
    @recipes = @q.result(distinct: true).include_related_models.published
  end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ransack

9
推荐指数
1
解决办法
942
查看次数

Ransack和act-as-taggable-on问题

我有一个使用act-as-taggable-on的几个分类法的模型

class Film < ActiveRecord::Base
  attr_accessible :mood_list, :genre_list, :tag_list, :country_list
  acts_as_taggable_on :countries, :genres, :moods, :tags
end
Run Code Online (Sandbox Code Playgroud)

我试图让Ransack搜索找到有任何心情和完全匹配国家的记录.但它返回了0条记录,而我有匹配的记录,请参阅:

Film.search({:moods_name_in=>['happy', 'snooze']}).result.count => 2    
Film.search({:countries_name_eq=>'USA'}).result.count => 2
Film.search({:moods_name_in=>['happy', 'snooze'], :countries_name_eq=>'USA'}).result.count => 0
Run Code Online (Sandbox Code Playgroud)

它什么都没有!但我肯定有一个:

>> f.countries
[#<ActsAsTaggableOn::Tag id: 13, name: "USA">]
>> f.moods
[#<ActsAsTaggableOn::Tag id: 17, name: "active">, #<ActsAsTaggableOn::Tag id: 16, name: "psyched">, #<ActsAsTaggableOn::Tag id: 15, name: "happy">]
The SQL generated is:
(3.2ms)  SELECT COUNT(DISTINCT "films"."id") FROM "films" LEFT OUTER JOIN "taggings" ON "taggings"."taggable_id" = "films"."id" AND taggings.context = ('moods') AND "taggings"."taggable_type" = 'Film' …
Run Code Online (Sandbox Code Playgroud)

activerecord has-and-belongs-to-many acts-as-taggable-on arel ransack

7
推荐指数
1
解决办法
1237
查看次数

将ActiveRecord habtm查询转换为Arel

我有一个非常普遍的habtm关系:

Photo has_and_belongs_to_many :tags
Tag has_and_belongs_to_many :photos
Run Code Online (Sandbox Code Playgroud)

在我的Photo模型中,我有一个"带标签"的方法,我用它来查找用一组给定的tag_ids标记的照片.此查询只需匹配具有所有给定标记的照片,但无需考虑是否存在任何其他标记.这是我的方法:

def self.with_terms( array )
  select('distinct photos.*').joins(:tags).where('tags.id' => array).group("photos." + self.column_names.join(', photos.')).having("count(*) = #{array.size}")
end
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

现在,为了更好地与我正在使用的其他库集成,我需要在Arel中重写它.(让它成为Arel节点?,不确定你通常称之为什么).

我一直在尝试这个,但说实话我以前从未尝试过使用过Arel,所以我有点失落.我一直在试验控制台并尝试:

t = Photo.arel_table
q = t.join(:tags).on(t[:tags_id].in(array))
Photo.where(q)
Run Code Online (Sandbox Code Playgroud)

但是,(1)我认为q首先不是正确的查询,并且(2)它创建了一个Arel::SelectManager,当传递给调用的地方时Cannot visit Arel::SelectManager.所以,显然我做错了.

更新:只是为了在这里特别具体,我希望返回一个Arel节点,因为我正在使用一个gem(ransack),希望你传递它的搜索方法的Arel节点.Ransack将此Arel节点与其他节点链接在一起,以生成复杂的搜索查询.

Arel大师可以告诉我这是怎么做的吗?

activerecord ruby-on-rails arel

6
推荐指数
1
解决办法
2223
查看次数