簡體   English   中英

rails has_many-查詢過多

[英]rails has_many - too many queries

我有4個模型,消息,組,用戶,成員

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
  has_many :groups_messages
  has_many :messages, :through => :groups_messages, :order => "created_at desc"

  named_scope :with_memberships, :include => :memberships

end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships
end

class Message < ActiveRecord::Base
  has_and_belongs_to_many :recipients, :class_name => "User"
  has_many :groups_messages
  has_many :groups, :through => :groups_messages

  def accessible
   self.groups.with_memberships.map(&:user_ids).include?(User.current.id)
  end

end

可以將消息發布到組,如果當前用戶是該組的成員,則他有權閱讀該消息。

我正在嘗試檢查用戶是否是Message.accessible組的成員,但它會產生很多查詢:

 Group Load (0.1ms)   SELECT `groups`.* FROM `groups` INNER JOIN `groups_messages` ON `groups`.id = `groups_messages`.group_id WHERE ((`groups_messages`.message_id = 381)) AND ((`groups_messages`.message_id = 381)) 
 Membership Load (0.1ms)   SELECT `memberships`.* FROM `memberships` WHERE (`memberships`.group_id = 1) 
 User Load (0.1ms)   SELECT `users`.id FROM `users` INNER JOIN `memberships` ON `users`.id = `memberships`.user_id WHERE ((`memberships`.group_id = 1)) 

我不需要用戶負載查詢-成員身份中包含user_id,因此最后一個查詢是無用的。

我嘗試將可訪問方法更改為

 def accessible
   self.groups.with_memberships.exists?(:user_id=>User.current.id)
 end

但隨后,它嘗試在組負載查詢中使用user_id,但是當然失敗了。 如何擺脫上一個查詢? Rails 2.3.2

我認為對用戶的查詢是由對User.current.id的調用引起的。 您可以嘗試將參數傳遞給可訪問方法嗎?

def accessible_to( user )
  self.groups.with_memberships.map(&:user_ids).include?(user.id)
end

我想這將從一個控制器中調用,在該控制器中(按照慣例)設置了current_user,因此在某些控制器操作中,您將執行以下操作:

@message.accessible_to(current_user)

更好地了解Rails之后,我意識到這是由於map(&:user_ids)

def accessible
  self.groups.with_memberships.map(&:user_ids).include?(User.current.id)
end

這種行為是絕對正常的,我的錯誤是我希望它的行為類似於groups.membership_user_ids ,並且表現為groups.user_ids

通過更改為固定

def accessible
 Membership.exists?(["user_id=? and group_id in (?)",User.current.id,self.group_ids])
end

實際上, include((User.current.id))這個部分由於某種原因甚至沒有工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM