0

我有 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 包含在 Membership 中,所以最后一个查询是无用的。

我尝试将可访问的方法更改为

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

但是随后它尝试在 Group Load 查询中使用 user_id 并且当然失败了。我怎样才能摆脱最后一个查询?导轨 2.3.2

4

2 回答 2

0

我认为对用户的查询是由对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)
于 2009-10-05T12:53:38.573 回答
0

在更好地理解了 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

实际上这部分包括?(User.current.id)甚至由于某种原因没有工作。

于 2010-01-19T10:11:03.187 回答