在rails中提前查询,尤其是在关联/联接表上的条件

时间:2014-08-16 23:21:18

标签: ruby-on-rails postgresql activerecord active-record-query

我看到无处不在寻找解决方案,而且很多时候觉得这就是我想要学习的东西,我需要继续关注,最后这里是...

我有一个模型

class Person < ActiveRecord::Base


  has_many :sent_messages, :class_name => 'Message', :inverse_of => :sender
  has_many :received_messages, :class_name => 'Message', :inverse_of => :receiver

  # ... ... ... 

end

模型消息

class Message < ActiveRecord::Base


  belongs_to :sender, :class_name => 'Person', foreign_key => 'sender_id'
  belongs_to :receiver, :class_name => 'Person', foreign_key => 'receiver_id'

  # ... ... ...

end 

现在,我必须在消息表中搜索搜索字段中输入的所有消息正文(它是的消息)在消息表中,Message模型只包含文本)与输入搜索字符串匹配或与 last_name 匹配(在消息的发件人中, last_name 是发件人的表中的列Person模型。我尝试了各种方法,但没有任何效果,当我看到这个link时,我认为就是这样。这是我一直在寻找的,但唉,这也拒绝了我并且发出了一个错误,这个错误随查询一起列出。

@messages = Message.includes(:sender).
                    where("UPPER(body) like UPPER(?) or 
                    UPPER(sender.last_name) like UPPER(?)", 
                    "%#{"sus"}%", "%#{"sus"}%").
                    references(:people)

references我给了&lt;:people&gt;虽然我尝试了&lt ;: sender&gt;作为给定链接建议给出实际表的名称并且没有按预期工作。
irb控制台中的上述查询出现以下错误: -

undefined method `references' ActiveRecord::Relation
PG::UndefinedTable: ERROR:  missing FROM-clause entry for table

我甚至尝试了 stackoverflow link,但这也没有用。

所以,请帮帮我......我错过了什么?

注意: - 我正在使用 PostgreSQL 作为我的数据库。

1 个答案:

答案 0 :(得分:1)

不确定为什么你会遇到麻烦。以下是否会产生错误?您是否只想检查sender.last_name而不是receiver.last_name

Message.includes(:sender)
       .where("UPPER(body) LIKE UPPER(?) OR 
               UPPER(people.last_name) LIKE UPPER(?)", 
               "%#{"sus"}%", "%#{"sus"}%")

几个笔记。我使用了senderS(复数)。如果这不起作用,请使用includes(:sender)找出Message.includes(:sender).to_sql上使用的别名。

我不知道%#{"sus"}%是什么(你能解释一下吗?),而LIKE %%是一个非常昂贵的查询。查看postgres的全文搜索。