我正在尝试将给定Header中的字段与“ Alarm模型中的其他字段进行比较。 正如您在代码中看到的那样,我通过3个不同的步骤过滤警报。 前两个完美地工作。 但是,最后一个不起作用。 它说:

undefined method `where' for #<Array:...

据我了解, .where是可用于数组的类方法。 为什么在这里不工作? 我也尝试使用.find_all_by和其他方法...但是没有用。

@header = Header.find(1)

# Extracts those alarms that are ACTIVE and have something in common with the tittles
@alarmsT = Alarm.activated.where("keyword in (?)", [@header.title_es, @header.title_en, @header.title_en])

# Extracts alarms when Header has at least the same categories as an alarm
@alarmsT = @alarmsT.select do |alarm| 
   @header.category_ids.all?{|c| alarm.category_ids.include? c }
end

// this is the one that does NOT work
# Extract alarms which share the same location as Header.events' town
@alarmsF = [] 
@header.events.each do |e|
    @alarmsF =  @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end

任何帮助我发现我所缺少的东西都非常感激。 谢谢

===============>>#1 票数:7 已采纳

在第一行中,您已成功在@alarmsT返回ActiveRecordRelation对象。

# Extracts those alarms that are ACTIVE and have something in common with the tittles
@alarmsT = Alarm.activated.where("keyword in (?)", [@header.title_es, @header.title_en, @header.title_en])

此时,您可以在@alarmsT上应用其他.where(...)方法,条件或范围,以进一步构建ARel表达式并返回结果。

但是,然后您对此关系运行筛选器,将@alarmsT转换为Array的实例

# Extracts alarms when Header has at least the same categories as an alarm
@alarmsT = @alarmsT.select do |alarm| 
   @header.category_ids.all?{|c| alarm.category_ids.include? c }
end

您无法再构建ARel表达式,因为Array不知道您的ARel的.where .where(...)方法或任何Alarm模型的范围或属性。 这就是为什么在下面的代码中您得到undefined method 'where' for #<Array:...错误的undefined method 'where' for #<Array:... -您正在Array的实例上调用.where() 一种不存在的方法。

@alarmsF = [] 
@header.events.each do |e|
  @alarmsF =  @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end

您可以通过不执行select来按类别ID进行过滤,而使用联接来解决此问题。 建立这样的联接(以验证相关表/列中值的至少一个子集的存在)在通过Google轻松找到的地方以及此处的StackOverflow上都有大量记录。

===============>>#2 票数:3

就像@Deefour所说的那样,使用select可以在Array而不是ActiveRecord::Relation对象中收集数据。

您确定需要LIKE查询吗? 通过查看它,我想您可以进行简单的直接比较。 如果我的假设是正确的,则可以重新排列代码的最后一部分:

@alarmsF = []
towns_from_events = @header.events.collect(&:town)

@alarmsT.each do |alarmsT|
    @alarmsF << alarmsT if towns_from_events.include?(alarmsT.location)
end

  ask by Sergio Nekora translate from so

未解决问题?本站智能推荐:

1回复

Rails 3.2-OR查询无法正常工作-重写查询

我很高兴使用此查询作为搜索表单。 但是,只是发现它无法正常工作。 失败的位是.where , like params[:query] 。 这like发生针对4个不同领域的4倍。 但是,结果表明这没有发生。 我一直在尝试将此查询转换为: 但是,这不起作用。 Error:
1回复

Rails 3.2-查询以提取记录无法正常工作-此语法正确吗?

我有2个模型。 一个叫Header ,另一个叫Alarm 警报有一列称为keyword 。 标头有4列,分别称为title_en, title_es, title_eu, title_fr 我想将给定Header这4 columns与每个Alarm的keyword字段进行比较。
1回复

将现有的Rails应用程序从SQLite迁移到PostgreSQL

我看到了一些有关如何从sqlite迁移到postgresql的教程,但它既适用于Mac,也适用于新的/新鲜的应用程序。 如果我已经有一个带有数据sqlite的应用程序该怎么办。 我正在使用Rails 3.2.2和Windows7。有人知道哪种方法是将sqlite迁移到postgresql的最
4回复

在现有的Rails应用程序上从Sqlite3切换到PostgreSQL

当我尝试在现有应用程序中从sqlite3切换到postgresql时,我遇到了rake db:migrate这个问题,我做了以下工作 1-rake db:create 2- rake db:migrate我收到此错误: == AddColumn1: migrating =====
2回复

Rails3:Heroku将RoR sqlite转换为Postgresql

我对Postgresql不熟悉,我可以在使用SQLite的本地开发机上使用此代码,但是在使用Postgresql的生产Heroku环境中它却失败了 Heroku日志中的错误:
4回复

Rails 3:按从另一个表计算的等级对ActiveRelation进行排序

我的评分系统非常简单,无论用户喜欢还是不喜欢这篇文章。 基本上,我有这样的东西,它可以完美地工作: 如您所料,我们的应用程序在数据库中变得庞大,流量增加,这部分代码成为瓶颈。 我试图用纯SQL重写它以提高性能。 我还试图将其作为ActiveRelation与其他条件联系起来
2回复

Rails 4,SQ Lite 3:NoMethodError-未定义的方法:nil:NilClass

我创建其中通知模型belongs_to用户(设计),并且每个用户has_many通知。 但是我以某种方式无法在我的应用程序控制器或任何其他控制器中获取通知: 我似乎总是以nil作为对象。 例如: 食谱/搜索视图(views / items / search.html.ham
2回复

Rails无法为nil:NilClass呈现JSON未定义方法“ new”

背景 我正在制作一个具有两个名称空间的Rails应用程序,这两个名称空间分别是admin (用于管理员目的)和api用于移动和网络客户端)。 昨天发生了一件奇怪的事。 我在PostgreSQL数据库中建立了一个新的表facilities ,其中包括id , name , creat
1回复

has_many:通过关联,外壳程序在Rails控制台中出现“ No Method Error”,NoMethodError:#的未定义方法

我正在使用Rails 3应用程序中的功能。 我有一个名为Box的新模型,其中有许多“产品”。 has_and_belongs_to_many给我带来麻烦。 因此,我制作了一个名为BoxProduct的新模型。 看起来像这样: -我在这里遇到的第一个问题是:当我在Rails控制台中
1回复

Sqlite3引用部署简单的heroku Rails应用程序

我在Heroku上部署一个非常简单的示例rails应用程序时遇到了问题。 这个应用程序使用数据库。 在带有sqlite3的本地(OSX)中没有问题,但我无法推送到Heroku,因为有些人丢失了对sqlite3的引用。 我把测试,开发和生产环境之间的区别放在Gemfile上: