Bağımsız hesap sitelerini ayırmak için alt alanlardan yararlanan bir Rails (şu an 2.3.4) uygulaması üzerinde çalışıyorum. Açık olmak gerekirse, foo.mysite.com 'un foo hesabı' içeriğini göstermesi ve bar.mysite.com 'un bar içeriğini göstermesi gerekir.Raylar: alt alana dayalı sorguları kapsamak için en iyi uygulama?
Tüm model sorgularının geçerli alt etki alanına ayrıldığından emin olmanın en iyi yolu nedir? Örneğin
, benim denetleyicileri biri gibi görünür:
@page = @global_organization.pages.find_by_id(params[:id])
(@global_organization
Not alt alan-fu aracılığıyla application_controller yer almaktadır.) ne tercih ediyorum olduğunda bir şey gibi:
@page = Page.find_by_id(params[:id])
Sayfa modelinin, doğru kuruluşa otomatik olarak eklendiği
. Böyle default_scope yönergesini kullanarak denedim: Küresel erişim için örgütün id: [organizasyonu] sadece nota, Yine
class Page < ActiveRecord::Base
default_scope :conditions => "organization_id = #{Thread.current[:organization]}"
# yadda yadda
end
((Sayfa modelinde), aynı application_controller Thread.current ayarlar.) Bu yaklaşımdaki sorun, varsayılan kapsamın ilk istek üzerine ayarlanması ve farklı alt alan adlarına yapılan sonraki taleplerde hiçbir zaman değişiklik olmamasıdır.
üç belirgin çözümler, şimdiye kadar:
1 kullanımlar ayrı her bir alt etki alanı için sankonlar ve sadece (mod_rails kullanılarak) alt alan başına uygulamanın farklı örneklerini çalıştırın. Bu yaklaşım, bu uygulama için ölçeklendirilemez.
2 Yukarıdaki orijinal denetleyici yaklaşımını kullanın. Ne yazık ki, uygulamada çok sayıda model bulunmaktadır ve modellerin çoğu, kuruluştan çıkarılmış birkaç bağlantıdır, bu yüzden bu gösterim hızlı bir şekilde zorlaşmaktadır. Daha da kötüsü, bu durumun geliştiricilerin sınırlamayı hatırlama ve uygulama ya da önemli bir güvenlik problemi riskini uygulamalarını gerektirmesidir.
3 Her istekte modellerin varsayılan kapsamını sıfırlamak için bir before_filter kullanın. Performansın ne kadar etkili olduğunu veya hangi modelin reqeust için güncelleneceğini en iyi nasıl seçeceğinizden emin değilsiniz.
Düşünceler? Eksik olduğum başka çözümler var mı? Bu, en iyi uygulama olması gereken ortak bir sorun gibi görünmektedir. Tüm girdiler takdir edildi, teşekkürler!
teşekkürler! Bu kodu pratikte test ettin mi? Ben sadece uygulamada denedim ve lambda gerçekten her buluntu üzerinde değerlendirilmekte olduğunu teyit ederken, default_scope döndürülen değerleri uygulamıyor. SQL çıkışına bakıldığında, koşullar: basitçe göz ardı ediliyor gibi görünüyor. Diğer çeşitli nedenlerden dolayı hata ayıklayıcımı henüz başlatamadım, ancak geri dönüp çalışır vaziyette en yüksek seviyeye geleceğim. Neden çalışmadığına dair düşünceler var mı? – qfinder
Dürüstçe İç sunucunun iş parçacığı nasıl kullandığı hakkında hiçbir fikrim yok, bu yüzden 'Thread.current [: organization]' modelinde çalıştım. Fakat bunun koşulların neden göz ardı edildiğini açıklayıp açıklamayacağını bilmiyorum. Esas olarak organazation_id = nil değerini aramak için varsayılan kapsamı tanımladığınızdan. – EmFi
Daha fazla araştırma üzerine, bu henüz işe yaramıyor gibi görünüyor. Bir yama var, ama YMMV: https://rails.lighthouseapp.com/projects/8994/tickets/1812-default_scope-cant-take-procs – EmFi