Есть ли способ проверить, существует ли ассоциация has_many в Rails 3.1? - PullRequest
12 голосов
/ 27 ноября 2011

Например, есть некоторые модели

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

Как я могу проверить, что модель имеет ассоциацию has_many? Как то так

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

И это можно использовать так

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

Заранее спасибо

Ответы [ 4 ]

17 голосов
/ 27 ноября 2011

А как насчет reflect_on_association?

Model_1.reflect_on_association(:images)

Или reflect_on_all_associations:

associations = Model_1.reflect_on_all_associations(:has_many)
associations.any? { |a| a.name == :images }
1 голос
/ 04 августа 2015

Я нашел простой способ достичь желаемого результата:

ModelName.method_defined?(:method_name)

Пример:

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

Ссылка: https://stackoverflow.com/a/18066069/936494

1 голос
/ 27 ноября 2011

Возможно, вы могли бы использовать response_to?

class ActiveRecord::Base
    def self.has_many_association_exists?(related)
        self.class.associations.respond_to?(related)
    end
end
0 голосов
/ 27 ноября 2011

Вы могли бы просто иметь метод, который пытается получить доступ к изображениям объекта Model_1 внутри блока исключения, например (примерно):

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

Внутри спасения вы можете просто вернуть false, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...