2013-06-05 16 views
12
class Post < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :tags, through: :posts_tags 
end 

class PostsTag < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :posts, through: :posts_tags 
end 

Post imha edildiğinde, tüm ilişkilendirmelerinin Tag'a gönderilmesini istiyorum. Çalıştırmak için PostsTag modelinde doğrulama istemiyorum. Sadece silmek istiyorum.has_many dosyasını silmek için uygun yol: kayıt kayıtları aracılığıyla?

Post modelindeki gönderim etiketleriyle ilişkisine bir bağımlı eklemenin, istediğim gibi çalıştığını buldum: has_many :posts_tags, dependent: :delete_all. Bununla birlikte, konuyla ilgili belge, bunun yerine şunu yapmamı önerdi: has_many :tags, through: :posts_tags, dependent: :delete_all. Bunu yaptığımda, Tag nesnesi yok edilir ve birleştirme nesnesi kalır.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

has_many için

, hep geri aramaları çalıştırmak böylece kaldırılmakta kaydı (ler) in imha yöntemini çağıracak yok. Ancak silme, ya bağımlı olan seçenek tarafından belirtilen stratejiye göre silinir ya da bağımlı olmayan seçenek verilirse varsayılan stratejiyi izler. Varsayılan strateji: nullify (yabancı anahtarları nil olarak ayarlayın), , has_many: through, varsayılan stratejinin delete_all olduğu yerde (birleştirme kayıtlarını çalıştırmadan, birleştirme kayıtlarını sil).

  1. nasıl varsayılan stratejiyi gerçekte kullanılan olabilir? Eğer ayrılırsam: tamamen bağımlı, hiçbir kayıt kaldırılmaz. Ve sadece şunu gösteremiyorum: has_many ilişkisine bağlı. Raylar geri dönüyor ve diyor ki: "Bağımlı seçenek, aşağıdakileri bekliyor: yok,: delete_all,: nullify veya: restrict ({})".
  2. ben belirtmezseniz:

Belki bu yanlış ve buldum yaklaşım okuyorum önermek gibi görünüyor ilişkilerin her iki bağımlı, bu PostsTag nesne üzerinde POST_ID geçersiz DEĞİLDİR işler doğru yoldur? arasında

+1

Bir Tag birden çok Mesaj tarafından kullanılıyorsa ne olur? Bir Mesaj silindiyse, diğer Mesajlar bundan etkilenir. –

+0

true, ve Tag olmalıdır 'has_many: gönderiler, yoluyla:: posts_tags' gönderiler,' has_many kullanır: posts_tags, bağımlı:: post_tag silmek ve etiketleri tek başına bırakmak. Artık etiketlerini bir komisyon görevi veya konsolu ile silebilirsiniz. – rmagnum2002

+0

Dergi düzeltildi, teşekkürler. Sadece belgeleri anlamaya çalışıyorum.İfadeler – Brian

cevap

17

Orijinal fikir:

has_many :posts_tags, dependent: :delete_all 

istediğini tam olarak budur. numaralı 'u, tüm ilişkili Etiketler'i yok edeceğinden, çok fazla olan ilişkiyi :tags bildirmek istersiniz. Silmek istediğiniz şey derneğin kendisidir - PostTag katılma modelinin temsil ettiği şey budur.

Peki, doktorlar neden yaptıklarıyla ilgili konuşuyor?

Post.find(1).destroy 
Post.find(1).tags.delete 

ilk çağrıyı (sizin senaryo) basitçe Yayınla yok edecek: Sen dokümantasyon anlatıyor bu senaryoyu yanlış anlama vardır. Yani, önerdiğim gibi, :dependent stratejisini belirtmedikçe. İkinci çağrı, belgelerin tarif ettiği şeydir. .tags.delete'u çağırmak, (varsayılan olarak) etiketleri gerçekten yok eder (çok fazla giriş yaptıklarından beri), ancak bu etiketleri birleştiren ilişkili birleştirme modelini.

+0

ahh kafa karıştırıcıdır, bu çok daha anlamlı olur – Brian

İlgili konular