【问题标题】:Eager load this rails association急切地加载这个 rails 协会
【发布时间】:2010-05-10 11:55:49
【问题描述】:

我有一个包含用户列表的 rails 应用程序。我在用户之间有不同的关系,例如合作、朋友、首选。列出用户时,我必须决定当前用户是否可以将特定用户添加到他的朋友中。

     -if current_user.can_request_friendship_with(user)
      =add_to_friends(user)
    -else
      =remove_from_friends(user)

   -if current_user.can_request_worked_with(user)
      =add_to_worked_with(user)
    -else
      =remove_from_worked_with(user)

can_request_friendship_with(user) 看起来像:

  def can_request_friendship_with(user)
   !self.eql?(user) && !self.friendships.find_by_friend_id(user)
  end

我的问题是,在我的情况下,这意味着每个用户有 4 个查询。清单 10 个用户意味着 40 个查询。我能以某种方式急切地加载这个吗?

【问题讨论】:

    标签: ruby-on-rails activerecord eager-loading


    【解决方案1】:

    让我们得到random_userscurrent_user
    所以non_firends = random_users - current_user.freindships 将在两个查询中返回用户查询的所有非朋友。

    其实你可以预加载你所有的好友,并使用include?方法进行好友数组:

    @friendships = current_user.friendships
    
    def can_request_friendship_with(user)
      !self.eql?(user) && @friendships.include? user
    end
    

    【讨论】:

    • 你的解决方案不是最好的,但它背后的想法是好的。在 can_request_friendship_with 函数中,我们无法访问该实例变量,但这不是问题。
    • 这不是一个完整的解决方案。我所说的是从数据库级别排除您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多