ruby-on-rails rails中是否有has_association?('association_name ')方法

zvokhttg  于 2022-12-15  发布在  Ruby
关注(0)|答案(3)|浏览(179)

我只想删除实际属于对象的资源。例如:

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
l2osamch

l2osamch1#

你可以自己写方法:

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

统一采购司

或者,正如您正确指出的那样,可以使用respond_to?

post.respond_to? :comments

2fjabf4q

2fjabf4q2#

可能类似于(在Rails 3中)?:

if Post.categories.exists?   # Rails 2 syntax would be Post.categories.present? (I think)
  true
else
  false
end
ryevplcw

ryevplcw3#

从Rails〉= 6.1开始,ActiveRecord就提供了两个相关的方法。
OP正在查找的变量是#associated,可以像这样使用:

Post.where.associated(:tags)

它的倒数是#missing

Post.where.missing(:tags)

...返回不带任何标记的Post模型。
The API docs有详细信息。

相关问题