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ş:
ActiveRecord VEYA sorgu...
Nasıl ActiveRecord/Raylar ile bir sorg...
SQL Sorgu BİRLİĞİ Tarafından Sipariş K...
Nasıl Ruby on Rails verilen ActiveReco...
JSON göndermek için nasıl ajax, DV yer...