有没有办法检查ActiveRecord的belongs_to
关联是否存在而不会引发数据库查询。
我使用example_association.present?
进行检查,如果相关,则会导致加载关联。
我想知道的是关联是否存在。
答案 0 :(得分:1)
您可以将reflect_on_all_associations
用作:
Foo.reflect_on_all_associations(:belongs_to).map(&:name).include?(:example_assoc)
其中:example_assoc
是belongs_to
关联之一。
或者如果你有一个模型类的实例:
@foo.class.reflect_on_all_associations(:belongs_to).map(&:name).include?(:example_assoc)
答案 1 :(得分:1)
class Article < ActiveRecord::Base
has_many :pages
end
class Page < ActiveRecord::Base
belongs_to :article
end
通过以下方式检查关联是否存在:
Article.reflect_on_association(:pages)
或
Page.reflect_on_association(:article)
如果该关联不存在,则Page.reflect_on_association(:article)
的返回值将为nil
,否则将如下所示:
#<ActiveRecord::Reflection::HasManyReflection:0x00007fbe099d9c10
@active_record=
Page(id: integer, name: string),
@association_scope_cache={},
@automatic_inverse_of=false,
@constructable=true,
@foreign_type="article_type",
@klass=nil,
@name=:article,
@options={:autosave=>true},
@plural_name="articles",
@scope=nil,
@scope_lock=#<Thread::Mutex:0x00007fbe099d9990>,
@type=nil>
它主要说明该关联存在,您可以获取有关它的更多信息。
答案 2 :(得分:0)
如果您尝试最小化查询数量,或许您应该考虑使用“include”来急切加载关联。
例如
foos = Foo.includes(:example_associations).all
然后在循环或其他什么时候调用
foo.example_associations.present?
不应调用任何其他数据库查询