2011-11-26 21 views
11

Ví dụ có một số mô hìnhCó cách nào để kiểm tra rằng liên kết has_many tồn tại trong Rails 3.1 không?

class Model_1 < ActiveRecord::Base 
    has_many :images, :as => :imageable 
end 

class Model_2 < ActiveRecord::Base 
    # doesn't have has_many association 
end 
... 
class Image < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
end 

Làm thế nào tôi có thể kiểm tra mô hình mà có hiệp hội has_many? Một cái gì đó như thế này

class ActiveRecord::Base 
    def self.has_many_association_exists?(:association) 
     ... 
    end 
end 

Và nó có thể được sử dụng để

Model_1.has_many_association_exists?(:images) # true 
Model_2.has_many_association_exists?(:images) # false 

Cảm ơn trước

Trả lời

13

Còn khoảng reflect_on_association thì sao?

Model_1.reflect_on_association(:images) 

Hoặc reflect_on_all_associations:

associations = Model_1.reflect_on_all_associations(:has_many) 
associations.any? { |a| a.name == :images } 
+0

Cảm ơn rất nhiều! Chính xác những gì tôi cần) –

0

Bạn chỉ có thể có một phương pháp mà cố gắng để truy cập vào một hình ảnh đối tượng Model_1 bên trong một khối ngoại lệ tương tự (khoảng):

begin 
    model1_obj.images 
rescue 
    puts 'No association between model_1 and images' 
end 

Giải cứu bên trong, bạn chỉ có thể trả về false nếu bạn muốn.

+0

Đó có thể là một phương pháp, hoặc thuộc tính hoặc bất kỳ thứ gì. Không phải là một hiệp hội. Nhưng có, gõ vịt :) –

1

Bạn có thể có thể sử dụng respond_to?

class ActiveRecord::Base 
    def self.has_many_association_exists?(related) 
     self.class.associations.respond_to?(related) 
    end 
end 
+0

Tôi có lẽ sẽ đi với câu trả lời của KARASZI István! – ktec

1

Tôi tìm thấy sau là cách đơn giản để đạt được kết quả mong muốn:

ModelName.method_defined?(:method_name) 

Ví dụ:

Model_1.method_defined?(:images) # true 
Model_2.method_defined?(:images) # false 

tham khảo: https://stackoverflow.com/a/18066069/936494

Các vấn đề liên quan