【问题标题】:Scope on each last elements of a has_many relationhas_many 关系的每个最后一个元素的范围
【发布时间】:2012-04-28 22:50:10
【问题描述】:

假设我在用户和消息之间有一个 has_many 关系。

我想设置一个范围,以便能够根据他们发布的最后消息中包含内容的用户来过滤用户。所以只在每个用户的最后一条消息中搜索。

下面我得到了所有消息中的结果...

class Contact < ActiveRecord::Base
    has_many :messages

    scope :filter_by_last_messages, lambda { |value|
        joins(:messages).where("messages.content = ?", value)
    }
end

【问题讨论】:

  • 我不认为如果没有 sql 中的子查询你可以做到这一点......

标签: ruby-on-rails activerecord scope has-many


【解决方案1】:

不可能在一个范围内一次性完成此操作,但您可以这样做:

scope :last_message, joins(:messages)
         .select("contacts.*, messages.content")
         .order("messages.created_at")

在你的控制器中:

if @contact.last_message.content == value
  do_something
end

所以可以确定一点范围。

【讨论】:

  • 谢谢,这就是我害怕的。
【解决方案2】:

我通过在我的 User 类中创建与最后一条消息的 belongs_to 关系来解决这个问题。

belongs_to :last_message, :class_name => 'Message'

我在 Message 类的 after_create 中设置了我的最后一条消息。 那么我的作用域如下:

scope :filter_by_last_messages, lambda { |value|
    joins(:last_message).where("content = ?", value)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多