Есть ли в рельсах метод has_association? ('Association_name') - PullRequest
1 голос
/ 10 августа 2011

Я хочу удалить ресурсы, только если они действительно принадлежат объекту. Например:

Post.all.each do |post|
    if post.has_method?('name')
        true
    else
        false
    end
end

Но проверка на ассоциацию:

Post.all.each do |post|
    if post.has_many?('tags')
        true
    else
        false
    end
end

или

Post.all.each do |post|
    if post.belongs_to?('category')
        true
    else
        false
    end
end

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Вы можете написать свои собственные методы:

def has_many?(association)
  self.class.reflect_on_all_associations(:has_many).any?{|a| a.name == association}
end

def belongs_to?(association)
  self.class.reflect_on_all_associations(:belongs_to).any?{|a| a.name == association}
end

так

Post.all.each do |post|
  post.has_many?('tags') ? "yeap" : "nope"
  post.belongs_to?('category') ? "yeap" : "nope"
end

Или вы можете использовать простую конструкцию:

Post.all.each do |post|
  post.methods.include?('tags') ? true :false
  post.methods.include?('category') ? true :false
  post.methods.include?('name') ? true :false
end

UPD

Или, как вы правильно указали, вы можете использовать respond_to?

 post.respond_to? :comments
1 голос
/ 10 августа 2011

Может быть что-то вроде (в Rails 3)?:

if Post.categories.exists?   # Rails 2 syntax would be Post.categories.present? (I think)
  true
else
  false
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...