【问题标题】:Creating a named scope that includes an associated model创建包含关联模型的命名范围
【发布时间】:2013-09-18 10:34:09
【问题描述】:

型号Organizerhas_manyevents

Event 具有属性begin_day:datepublished:boolean

对于尚未发生的事件,我有以下查询:

@organizer.events.order('begin_day asc').where('begin_day >= ?', Date.today).where(published: true).limit(8)

我想将其提取到一个作用域中,这样它就可以实现如下:

@organizer.upcoming_events.limit(8)

我如何创建这个包含关联模型的范围?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    试试这样:

    scope :upcoming_events, -> { joins(:events).where("events.begin_day >= ?", Date.today).where(events: {published: true}).order('events.begin_day asc') }
    

    【讨论】:

      【解决方案2】:

      has_manybelongs_to 帮助程序自动创建字段和范围,以便您轻松加入两个模型,在用户定义的范围内,您必须手动加入这些模型。 ;)

      class Event
        belongs_to :organizer
      end
      
      class Organizer
        has_many :events
      
        scope :upcoming_events, joins(:events).order('begin_day asc').where('begin_day >= ?', Date.today).where(published: true)
      
        # lol007's query
        scope :upcoming_events, -> { joins(:events).where("events.begin_day >= ?", Date.today).where(events: {published: true}).order('events.begin_day asc') }
      
        end
      end
      

      【讨论】:

      • 这可能会引发错误,例如,PG::Error: ERROR: column reference "published" is ambiguous 如果两个模型都存在published
      • 您的查询绝对安全
      • 谢谢你的解释,看看我的回答。在这种情况下,scope 有什么好处吗?
      【解决方案3】:

      阅读@TheChamp 在他的回答中的推理,似乎只是在查询部分粘贴一个方法同样有效。也可以链接。

      class Event
        belongs_to :organizer
      end
      
      class Organizer
        has_many :events
      
        def upcoming_events
          self.events.order('begin_day asc').where('begin_day >= ?', Date.today).where(published: true)
        end       
      
        end
      end
      

      现在可以了:

      @organizer.upcoming_events.limit(8)
      

      【讨论】:

      • 对我来说看起来不错,它使用 events 范围更好:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多