2012-12-19 35 views
12

Temel olarak kendi ilişkilendirme türlerini tanımlamak için ortak bir yaklaşım olup olmadığını bilmek isterim. Bazı ayrıntılar:özel raylar has_many ilişkisi (pg dizisi aracılığıyla)

Bir PG dizi sütunu user_ids olan bir modelim var conversations. select conversations.* from conversations where USER_ID = ANY(conversations.user_ids)

finder_sql yana ve 's arkadaş şimdi artık yok, gerçekten bu sözde has_many ilişki uygulamak için en iyi yol olacağını bilmek istiyorum: Yani, kullanıcı konuşmaları almak için hemen gitmem gerek? Böylece temelde ActiveRecord::Associations::CollectionAssociation kendi uygulanması düşünüyorum ve bazı iyi referanslar var olup olmadığını bilmek istiyorum yoksa tavsiye eğer nereden başlayacağınızı

def conversations 
    Conversation.where("#{id} = ANY (conversations.users)") 
end 

:

anda ben gibi yöntemleri kullanmak

Conversation.user.select{ |conversation| conversation.user_ids.include?(params[:id]) 

Con:


+0

Şema üzerinde kontrolünüz var mı? Yabancı anahtarlar tutmak için bir dizi kullanmak, çünkü şimdi neden olan sıkıntılardan dolayı kötü bir uygulama değil, çünkü soruyorum. Bir dizi kullanarak düşünmeniz gereken _only_ zamanı, her zaman veritabanı tarafından hiçbir anlam ifade etmeyen bölünemez bir şey olarak ele alınabileceği zamandır. –

+3

haklı olarak, bu yaklaşımla sadece eğitim amaçlı olarak gitmeye karar verdim. Ayrıca, dizi performansıyla kesinlikle hayrete düştüm. Beni ikna eden bir başka şey de şuydu: http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/, bu da bana göre –

+0

'dan beri kötü bir fikir değil. ARRAY ile gitmeye karar verebilirsiniz, belki SQL Görünümleri ile de gidebilirsiniz? https://github.com/thoughtbot/scenic Ve temelde dizininizi şunun gibi bir şeye benzeyen başka bir tablo yaratın: (conversation_id, user_id) (çok fazla), böylece normal kullanabilirsiniz birçok ilişki vardır. –

cevap

0

Nasıl yaklaşık olarak user_ids sütununun serileştirilmesi ve geçerli kullanıcı kimliğinin params tarafından geçirilmesi [: id]

Ana yaklaşım, eğer bir diziniz varsa, içinde 'bir şey' olup olmadığını kontrol edebilirsiniz.) yöntem. Bu şekilde düşünerek, aslında bu dizinin içerdiği ID'leri içerme yöntemiyle (bu durumda kullanıcılar) nesneleri seçmek için seçme yöntemini kullanabilirsiniz. Açık mıyım?

işe yaradı söyle

...

0

Ben temelde sadece ilgili yöntem kodu koyabilirsiniz düşünüyorum:

has_many :conversations, ->(user) { where("#{user.id} = ANY (conversations.users)") } 

Eninde sonunda da, aynı ya da böyle olmalıdır. Yönteminiz, zincirleyebileceğiniz bir ilişki döndürür. Başka bir alternatif şöyle olabilir:

has_many :conversations, -> { where('users.id IN conversations.users') } 

Bazı finagling gerekebilir. Yine de yeni bir katılma tablosu ekleyememenizin bir nedeni var mı? İdeal olan, bunu conversations_users tablosuna taşımak olacaktır. Daha sonra masaya temiz bir şekilde katılabilir ve yabancı anahtar kısıtlamalarından yararlanabilirsiniz.

İlgili konular