相关疑难解决方法(0)

我在哪里可以找到好的AREL文档?

我正在尽可能多地学习关于AREL的知识.但我不知道该怎么看.

在rubydoc上找到了一些文档,但在显示什么是"公共API"/可访问的东西方面它似乎不太好.例如,我找不到有关"包含"方法的任何信息.

那么,究竟如何学习AREL提供的大部分内容呢?(即没有深入研究源代码)

documentation arel ruby-on-rails-3

22
推荐指数
3
解决办法
8782
查看次数

Rails,Ransack:如何在"所有"匹配中搜索HABTM关系而不是"任何"

我想知道是否有人有使用Ransack与HABTM关系的经验.我的应用程序photos与habtm关系terms(术语就像标签).这是我正在经历的简化解释:

我有两张照片:照片1和照片2.他们有以下条款:

照片1:A,B,C

照片2:A,B,D

我构建了一个ransack表单,并在搜索表单中为所有术语创建了复选框,如下所示:

- terms.each do |t|
  = check_box_tag 'q[terms_id_in][]', t.id
Run Code Online (Sandbox Code Playgroud)

如果我使用:q[terms_id_in][]并且我检查"A,C"我的结果是照片1和照片2.我只想要照片1,因为我要求A和C,在这个查询中我不关心B或D但我想要A和C都存在于给定的结果中.

如果我使用q[terms_id_in_all][]我的结果是零,因为两张照片都不包含A和C.或者,也许,因为每个连接只有一个术语,所以没有连接匹配A和C.无论如何,我只想要返回照片1.

如果我使用任何种类的q[terms_id_eq][]我从来没有得到任何结果,所以我认为这不适用于这种情况.

因此,给定一个habtm连接,如何在忽略未给定值的同时搜索与给定值匹配的模型?

或者,对于任何不熟悉Ransack的rails/sql专家,你怎么可能去创建一个搜索表单,比如我正在描述一个带有habtm连接的模型?


更新:根据相关问题的答案,我现在已经构建了一个正确匹配它的Arel查询.不知何故,你应该能够使用Arel节点作为搜索者,或者像cdesrosiers所指出的那样,作为自定义谓词,但到目前为止我还没有得到这样的工作.

根据该答案,我设置了以下ransack初始化程序:

Ransack.configure do |config|
  config.add_predicate 'has_terms',
    :arel_predicate => 'in',
    :formatter => proc {|term_ids| Photo.terms_subquery(term_ids)},
    :validator => proc {|v| v.present?},
    :compounds => true
end
Run Code Online (Sandbox Code Playgroud)

...然后在Photo上设置以下方法:

def self.terms_subquery(term_ids)
  photos = Arel::Table.new(:photos)
  terms = Arel::Table.new(:terms)
  photos_terms = Arel::Table.new(:photos_terms)
  photos[:id].in(
  photos.project(photos[:id])
    .join(photos_terms).on(photos[:id].eq(photos_terms[:photo_id]))
    .join(terms).on(photos_terms[:term_id].eq(terms[:id]))
    .where(terms[:id].in(term_ids))
    .group(photos.columns)
    .having(terms[:id].count.eq(term_ids.length))
  ).to_sql
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不起作用.在terms_subquery生成正确的SQL时,结果Photo.search(:has_terms => …

sql search ruby-on-rails has-and-belongs-to-many ransack

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

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
查看次数

如何获得habtm协会的arel表?

我有两个ActiveRecord有HABTM关联的模型.

我想写一个scope使用Arel来获取孤儿记录.

我的问题是我找不到一种方法来检索arel_table关联.由于关系是HABTM,因此没有可以调用的模型arel_table.

我现在有以下(有效),但我创建了一个新的arel表,其中包含连接表的名称(使用该reflect_on_association方法检索).

scope :orphans, lambda {
    teachers = arel_table
    join_table = Arel::Table.new(reflect_on_association(:groups).options[:join_table])

    join_table_condition = join_table.project(join_table[:teacher_id])
    where(teachers[:id].not_in(join_table_condition))
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下SQL:

SELECT `teachers`.* 
FROM `teachers`    
WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id`  
                               FROM `groups_teachers` ))
Run Code Online (Sandbox Code Playgroud)

那么有没有更好的方法来检索arel_table而不是创建一个新的?

sql activerecord ruby-on-rails arel ruby-on-rails-3

5
推荐指数
1
解决办法
1572
查看次数