SORU
13 Temmuz 2011, ÇARŞAMBA


ActiveRecord Sorgu Birliği

Karmaşık sorgular (en azından benim için) RoR sorgu arayüzü ile bir çift yazdım:

watched_news_posts = Post.joins(:news => :watched).where(:watched => {:user_id => id})
watched_topic_posts = Post.joins(:post_topic_relationships => {:topic => :watched}).where(:watched => {:user_id => id})

Bu sorgular hem de kendileri tarafından çok iyi çalışıyor. Hem Yazı nesneleri döndürür. Tek bir ActiveRelation bu mesajları birleştirmek istiyorum. Bir noktada mesajlar yüzlerce, binlerce olabilir bu yana, bu veritabanı düzeyinde yapılması gerekiyor. Eğer bir MySQL sorgu halinde, sadece UNION operatör kullanıcı edebilirim. Kimseye bir şey RoR sorgu arayüzü ile benzer yapabilirim biliyor mu?

CEVAP
14 Mart 2013, PERŞEMBE


Burası UNİON birden çok kapsam sağlar yazdığım kısa bir modül. Ayrıca ActiveRecord örneği olarak sonuçları döndürür::İlişkisi.

module ActiveRecord::UnionScope
  def self.included(base)
    base.send :extend, ClassMethods
  end

  module ClassMethods
    def union_scope(*scopes)
      id_column = "#{table_name}.id"
      sub_query = scopes.map { |s| s.select(id_column).to_sql }.join(" UNION ")
      where "#{id_column} IN (#{sub_query})"
    end
  end
end

Burada özü: https://gist.github.com/tlowrimore/5162327

Düzenleme:

İstendiği gibi, burada UnionScope nasıl çalıştığını bir örnek:

class Property < ActiveRecord::Base
  include ActiveRecord::UnionScope

  # some silly, contrived scopes
  scope :active_nearby,     -> { where(active: true).where('distance <= 25') }
  scope :inactive_distant,  -> { where(active: false).where('distance >= 200') }

  # A union of the aforementioned scopes
  scope :active_near_and_inactive_distant, -> { union_scope(active_nearby, inactive_distant) }
end

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elly Awesome

    Elly Awesome

    15 ŞUBAT 2010
  • Learn Math Tutorials

    Learn Math T

    20 Kasım 2011
  • SoundHound

    SoundHound

    8 Mart 2006