0

我正在为我的学校在 Rails 上做一个项目(不要担心这不是在代码上评分),我正在寻找一种干净的方式来遍历 ActiveRecord 中的关系。

我有 ActiveRecord 类,称为用户、组和分配。用户和组具有 HABTM 关系以及组和分配。现在我需要的是一个用户函数 get_group(aid),其中“给定一个用户,找到给定分配的组”。

简单的路线是:

  def get_group(aid)
    group = nil
    groups.each { |g| group = g if g.assignment.find(aid).id == aid }
    return group
  end

是否有更简洁的实现利用组和分配之间的 HABTM 关系而不仅仅是迭代?我还尝试过的一件事是 find() 的 :include 选项,如下所示:

  def get_group(aid)
   user.groups.find(:first, 
     :include => :assignments, 
     :conditions => ["assignments.id = ?", aid])
  end

但这似乎不起作用。有任何想法吗?

4

1 回答 1

3

首先,要小心。由于您同时使用这两种关系,因此给定的andhas_and_belongs_to_many可能有多个。所以我要实现一个返回s数组的方法。GroupUserAssignmentGroup

其次,User#get_group采用分配 id 的方法的名称非常具有误导性,并且不像 Ruby。

Array#&这是使用 Ruby 的交集运算符获取所有公共组的简洁方法。我给该方法取了一个更具启发性的名称并把它放在上面,Group因为它正在返回Group实例。但是请注意,它会加载Group与一个相关但与另一个无关的 s:

class Group < ActiveRecord::Base
  has_and_belongs_to_many :assignments
  has_and_belongs_to_many :users

  # Use the array intersection operator to find all groups associated with both the User and Assignment 
  # instances that were passed in
  def self.find_all_by_user_and_assignment(user, assignment)
    user.groups & assignment.groups
  end
end

然后如果你真的需要一个User#get_groups方法,你可以这样定义它:

class User < ActiveRecord::Base
  has_and_belongs_to_many :groups

  def get_groups(assignment_id)
    Group.find_all_by_user_and_assignment(self, Assignment.find(assignment_id))
  end
end

虽然我可能会命名它User#groups_by_assignment_id

我的Assignment模型很简单:

class Assignment < ActiveRecord::Base
  has_and_belongs_to_many :groups
end
于 2008-10-02T07:29:53.857 回答