检查关联是否存在而不会导致数据库命中

时间:2014-03-25 21:35:59

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4 associations

有没有办法检查ActiveRecord的belongs_to关联是否存在而不会引发数据库查询。

我使用example_association.present?进行检查,如果相关,则会导致加载关联。

我想知道的是关联是否存在。

3 个答案:

答案 0 :(得分:1)

您可以将reflect_on_all_associations用作:

Foo.reflect_on_all_associations(:belongs_to).map(&:name).include?(:example_assoc)

其中:example_assocbelongs_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?

不应调用任何其他数据库查询