我看到无处不在寻找解决方案,而且很多时候觉得这就是我想要学习的东西,我需要继续关注,最后这里是...
我有一个模型人:
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 作为我的数据库。
答案 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的全文搜索。