2015-10-29 15 views
6

2 Rails modelim var: Kitap ve Kategori, bir kitabın belongs_to bir kategorisi, bir kategori has_many kitap.Rails has_many ilişkisinde eksik dokunma seçeneği

Kategori adı her kitabın sayfasında gösterilir ve sayfalar önbelleğe alınır.

Bir kategori adını değiştirirseniz ('Sci Fi'den' Bilim Kurgu'ya 'diyelim), ilgili tüm kitap sayfaları eski olacak ve HTML yenilemeyi tetiklemek için kitapların "dokunulması" gerekir.

anlamda yapabilmek için yapmak gibi görünüyor: touch mekanizması has_many ilişkiler için önemli bir performans isabet neden olabilir her nesneyi, örneğini çünkü

class Category << ActiveRecord::Base 
    has_many :books, touch: true 
end 

Ama the option is unavailable sanırım.

şöyle çiğ SQL kullanıyorum, o önlemek için: oldukça korkunç

class Category << ActiveRecord::Base 
    has_many :books 
    after_update -> { 
    ActiveRecord::Base.connection.execute "UPDATE books SET updated_at='#{current_time_string}' WHERE category_id=#{id})" 
    } 
end 

. Daha iyi bir yolu var mı?

cevap

5

has_many ilişkilendirmesinde touch'u kullanamazsınız, yalnızca belongs_to ile çalışır, bu bir gerçek.

Ne istediğinizi doğru olarak anlarsam, Kitap modelindeki touch:true ile olan yanıtlar çalışmayacaktır, çünkü Kategori nesnesini değiştirdiğinizde ve görünüm yeniden oluşturulmazken Kitap nesnesi güncellenmeyecektir.

Bence çözümünüz bunun için en iyisi. (Ayrıca, books.update_all(updated_at: Time.now))

+1

Her iki konuda da haklısınız: 1) Bir kategori değiştiğinde tüm kitapları değiştirmem gerekiyor; 2) update_all daha basittir ve modelleri başlatmaz; Doğrudan DB'ye gönderilen SQL sorgusu, performans sorunlarını önler. – Giuseppe

+0

ama bu bir önbellek güncellemesini tetikleyecek mi? – user1262904

0

ActiveRecord'da ilişkiler için bir dokunma seçeneği vardır. beklenen senin sözdizimi ile Tek fark belongs_to için bir seçenek olmasıdır:

class Book << ActiveRecord::Base 
    belongs_to :categories, touch: true 
end 

Dokümantasyon: http://apidock.com/rails/ActiveRecord/Persistence/touch

+1

İlk önce, kural olarak 'kategori' (tekil) olmalıdır. Bir kitabın oluşturulduğu/değiştirildiği zaman kategoriyi güncelleyin, bu da ihtiyacım olanın tersidir, yani ebeveyn değiştiğinde tüm çocuklara dokunun. – Giuseppe

0

Bu sizin kitaplar modelinde olmalıdır belongs_to yöntemine kullanılabilir. Yani hala kullanabilirsin.

+0

Lol, aynı zamanda cevaplandırdı, diğer cevabın daha iyi bir açıklaması var :). –

+0

Teşekkürler dostum: p – Caillou