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

  • iMasterful

    iMasterful

    11 EYLÜL 2009
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • pjtoohot

    pjtoohot

    15 NİSAN 2008