2011-02-03 13 views
5

Diğer birkaç ActiveRecord sınıfında yer alacak ilişkilendirmeler ve yöntemler içeren bir Blockable modülüne sahibim.Raylar: AR modelimde yer alan bir modülde ilişkilendirme uzantısını nasıl tanımlarım?

İlgili kod:

module Blockable 
    def self.included(base) 
    base.has_many :blocks 
    end 
end 

Ben bir dernek uzantısı eklemek istiyorum. Her zamanki sözdizimi (Bir modülde ilişki tanımlayan değilim yani) şu şekildedir: AR modeli bulunan modül kullanıldığında

# definition in Model < ActiveRecord::Base 
has_many :blocks do 
    def method_name 
    ... code ... 
    end 
end 

# usage 
Model.first.blocks.method_name 

Bu söz dizimi çalışmaz. undefined method 'method_name' for #<ActiveRecord::Relation:0xa16b714>'u alırım.

Diğer AR sınıflarına dahil edilmek üzere bir modülde bir ilişkilendirme uzantısı tanımlamaya nasıl başlamalıyım?

+2

Modülünüz gayet iyi görünüyor, yanlış adlandırıyormuşsunuz gibi görünüyor. 'Model.blocks' çalışmaz. Onu bir nesneye çağırıyorsun, o nesnenin bir örneği değil. Model.first.blocks.method_name 'ı deneyin. –

+0

Özür dilerim, örnek ver bana göre. Bir örnek üzerinde aramaya çalışıyorum - bunu düzeltmek için sorumu güncelledim. – nfm

cevap

2

Argh, emiyorum.

İlişkilendirme uzantısının bozulmasına neden olan alakasız bir hata yaşadım.

self.included(base) 
    base.has_many :blocks do 
    def method 
     ... 
    end 
    end 
end 

# OR 

self.included(base) 
    base.class_eval do 
    has_many :blocks do 
     def method 
     ... 
     end 
    end 
    end 
end 
4

Şu an Rails kodumda (2.3.8) benzer bir şey var. Ben base.has_many yerine base.class_eval kullandı:

module Blockable 
    self.included(base) 
     base.class_eval do 
      has_many :blocks do 
       def method_name 
        # ...stuff... 
       end 
      end 
     end 
    end 
end 

Whew - spacebarring çok oldu ...

Neyse, bu benim için çalışıyor - umarım sizin için de çalışacağız!

+0

Baktığın ve denemek için başka bir yöntem verdiğiniz için teşekkürler. Görünüşe göre başka bir yere batırdım ve her ikisi de işe yarıyor! – nfm

7

Raylar 3 bunun için bazı yardımcı yöntemleri vardır:

benim özgün yöntemi ve Raylar 3.0.3 altında Xavier Holt yöntem çalışması hem doğruladıktan. Bu örnek The Rails 3 Way, 2nd Edition:

module Commentable 
    extend ActiveSupport::Concern 
    included do 
    has_many :comments, :as => :commentable 
    end 
end 
İlgili konular