Rails uygulamasının Rails 4.2'ye taşınmasıyla karmaşık has_many ilişkileri. Bu Rails uygulaması kısmen (örneğin JOINs yerine subselects) DB optimizasyonları nedeniyle kısmen oldukça karmaşık bir manuel SQL kodu içerir, kısmen yazılı olarak (Rails 3.0), kısmen bilgi eksikliğinden dolayı makul bir alternatif nedeniyle (Umarım, en azından - bu çözülmesi kolay olurdu.Rails> 4.1 (with finder_sql)
Örnek: Bir InternalMessage sınıfı. Mesajlar kullanıcılar arasında (bir InternalMessage Alıcısı ve mesajların 'silinmesi') gönderilebilir, birkaç tane olabileceğinden, InternalMessagesRecipients'da saklanır ve okunabilir, iletilebilir, iletilebilir ve silinebilir. dernek şuna benzer:
class User < AR::Base
has_many :internal_messages,
:finder_sql => "SELECT DISTINCT(internal_messages.id), internal_messages.* FROM internal_messages " +
' LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id' +
' WHERE internal_messages.sender_id = #{id} OR internal_messages_recipients.recipient_id = #{id}',
:counter_sql => 'SELECT count(DISTINCT(internal_messages.id)) FROM internal_messages ' +
' LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id' +
' WHERE internal_messages.sender_id = #{id} OR internal_messages_recipients.recipient_id = #{id}'
# ...
end
anahtar bölümü sonundaki "VEYA" deyimdir - ben hem alınan ve ayrı kullanıcı tablosuyla birleştirilmiş iletiler, gönderilen almak istiyorum bu dernek ile: bir InternalMessage beri
has_many :sent_messages, -> { where(:sender_deleted_at => nil) }, :class_name => 'InternalMessage', :foreign_key => 'sender_id' #, :include => :sender
has_many :internal_messages_recipients, :foreign_key => 'recipient_id'
has_many :rcvd_messages, :through => :internal_messages_recipients, :source => :internal_message, :class_name => 'InternalMessage'
birkaç alıcıları olabilir (ve aynı zamanda gönderici kendisi gönderilebilir).
S: Bu finder_sql
'u bir Rails 4.2 uyumlu has_many
tanımına nasıl yüklerim?
Elbette, sonuçların hafızaya alınmasını istiyorsanız özellikle "yeniden yükleme" ile çalışırlar. Yabancı ilişkileri olmayan bu ilişkileri sürdürmek için raylar almanın bir yolu var mı? – duane