我是 Rails 新手。玩得很开心。查询 API 给了我
有些麻烦。我一直在快速地缩放并做很多事情,
但这是我第一次花几个小时试图弄清楚。
它不像我以前使用过的任何东西——常规 SQL 或 Hibernate,
管他呢。
我的模型非常简单。
- 私人消息有多个收件人
- A Recipient has a Receiver (which of class User)
- 收件人还有“is_read”和“is_deleted”字段
我的目标是建立一个查询来查找所有未读且未删除的内容
给定用户的私人消息。为了实现这一目标,我们需要加入
'private_messages' 到 'recipients'...然后 'recipients' 到
“用户”。
这是相关的用户模型代码:
has_many :sent_messages, :class_name => 'PrivateMessage', :foreign_key => 'sender_id'
has_many :recipient_of_messages, :class_name => 'Recipient', :foreign_key => 'receiver_id'
scope :by_id, lambda { |id| where(:id => id) }
我的收件人模型具有以下相关代码:
belongs_to :receiver, :class_name => 'User', :foreign_key => "receiver_id"
belongs_to :private_message
scope :unread, where(:is_read => false).where(:is_deleted => false)
scope :by_receiver_id, lambda { |id| Recipient.joins(:receiver).merge(User.by_id(id)) }
scope :unread_by_receiver_id, lambda { |id| unread.by_receiver_id(id) }
单独测试时,此方法 100% 有效。
然而,当我编写私人消息查询代码时,我遇到了问题。
belongs_to :sender, :class_name => 'User'
has_many :recipients, :class_name => 'Recipient'
scope :sorted, order("private_messages.created_at desc")
scope :non_deleted, where(:is_deleted_by_sender => false)
scope :non_deleted_by_sender_id, lambda { |id| sorted.non_deleted.joins(:sender).merge(User.by_id(id)) }
# this scope does not work
scope :non_deleted_by_receiver_id, lambda { |id| sorted.joins(:recipients).merge(Recipient.by_receiver_id(id)) }
scope :newest, sorted.limit(3)
# this scope does not work either
scope :newest_unread_by_receiver_id, lambda { |id| newest.joins(:recipients).merge(Recipient.unread_by_receiver_id(id)) }
当我尝试使用“newest_unread_by_receiver_id”或“non_deleted_by_receiver_id”时,出现以下异常:
ActiveRecord::ConfigurationError: Association named 'receiver' was not found; perhaps you misspelled it?
这对我来说没有多大意义......因为如果名字被拼写出来
错了,为什么我测试隔离时它没有失败?
有人可以帮我吗?这让我发疯。有时
像这样,我只想用完整的 sql 或 Hibernate QL 进行编程,这样我就可以完成它了:(
如果我完全错误地处理了这个问题,那么如果您也让我知道这一点,我将不胜感激。我的印象是,使用范围和 ActiveRelation 是 Rails 3.1 中前进的方向。
Thanks