farklı yabancı anahtarlar aracılığıyla iki kez, diğer modele Node
ait bir model Edge
sahip olan dernek masaya katılmak sorgulamak:Raylar takma
def Edge < ActiveRecord::Base
belongs_to :first, class_name: 'Node'
belongs_to :second, class_name: 'Node'
end
Ve ActiveRecord kullanarak bu sorguyu gerçekleştirmek istiyorum:
SELECT * FROM edges INNER JOIN nodes as first ON first.id = edges.first_id WHERE first.value = 5
Edge.joins(:first)
:
I .joins()
yöntemiyle ilişki katılma yolu bulunan
Ancak bu, bir ilişkilendirme adı değil, bir tablo adı kullanarak sorgu üretir, bu nedenle .where()
yönteminde ilişki soyutlamasını kesen tablo adını açıkça kullanmak zorundayım.
Edge.joins('INNER JOIN nodes as first ON nodes.id = edges.first_id')
Ama bu daha da soyutlama kırar:
Edge.joins(:first).where(nodes: {value: 5})
Ben de açıkça modeli takma tanımlamak için .joins()
yöntemde SQL sorgusu kullanabilirsiniz.
Katmandaki tablo takma adlarını otomatik olarak tanımlamanın yolu olması gerektiğini düşünüyorum. Ya da belki böyle bir işlevi kendi başıma yazmanın bir yolu. gibi bir şey:
def Edge < ActiveRecord::Base
...
def self.joins_alias
# Generate something like
# joins("INNER JOIN #{relation.table} as #{relation.alias} ON #{relation.alias}.#{relation.primary_key} = #{table}.#{relation.foreign_key}")
end
end
Ama bunun adı gibi spesifik ilişki, yabancı anahtar hakkında bilgi erişme hakkında herhangi bir bilgi bulamadık vb Peki nasıl yapabilirim?
Ayrıca, Rails'in bile şimdiye kadarki 4. büyük versiyonunda bile böyle belirgin bir özelliğin bu kadar karmaşık olması garip görünüyor. Belki bir şey özlüyorum