1

我正在考虑在 has_many 关系之间添加一些额外的属性。

例如,我有一个用户表和一个组表。用户可以通过 :through has_many 关系加入群组。我想在该组中添加用户的“角色”属性。

create_table "groupization", :force => true do |t|
    t.integer  "user_id"
    t.integer  "group_id"
    t.string  "role"
    t.datetime "created_at",                     :null => false
    t.datetime "updated_at",                     :null => false
  end

我想知道,我怎样才能访问角色属性。我在想类似的事情:

user.groups[0].role 

这是一个正确的方法吗?我知道语法错误(我试过了);正确的语法是什么样的?谢谢!

4

4 回答 4

3

我认为没有一种优雅的方法可以做到这一点,就像这样:

user.groupizations.find_by_group_id(user.groups[0].id).role

您提供的示例代码[0]看起来并不实际,因此如果您向我们展示了您实际想要访问role的方式,可能会有一种更简洁的方式。

这是在这里讨论过的。

于 2012-05-13T00:53:45.287 回答
2

在您的用户模型中,您将拥有如下内容:

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

您只需在控制台中通过has_many关系访问角色信息即可。groupizations

foo = User.first
bar = foo.groupizations.first
bar.role

假设您对第一个用户进行了分组。

可以像这样获得特定的用户/组关系:

Groupizations.where("group_id = ? and user_id = ?", group.id, user.id)

然后从那里你可以得到你正在寻找的角色。

于 2012-05-13T12:32:56.903 回答
2

最好的方法是使用连接模型,然后将方法委托/代理到组,例如:

class User < ActiveRecord::Base
  has_many :memberships, :include => :group, :dependent => :delete_all
  has_many :groups, :through => :memberships
end

class Group < ActiveRecord::Base
   has_many :memberships, :include => user, :dependent => :delete_all
   has_many :users, :through => :memberships
end

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

  def group_name
    group && group.name
  end

  def user_name
    user && user.name
  end
end

然后,如果您要在视图中显示用户组:

<ul>
<% @user.memberships.each do |membership| %>
  <li><%= membership.group_name %> (<%= membership.role %>)</li>
<% end %>
</ul>

同样对于组的​​用户:

<ul>
<% @group.memberships.each do |membership| %>
  <li><%= membership.user_name %> (<%= membership.role %>)</li>
<% end %>
</ul>

这种方式只需要三个查询 - 用户、组和成员资格各一个。

于 2012-05-13T12:53:08.597 回答
1

目前尚不清楚您到底在寻找什么,所以我将抛出另一个带有控制台输出的示例,以便更清楚地了解它发生了什么。但是,要点是,要仅获取用户的角色,您需要指定您指的是哪个用户组(如@BuckDoyle 所示,尽管他只是选择第一个来反映您的示例) . 要获取所有用户角色的列表,您需要遍历用户的分组。

1.9.3-p194 :050 > User.find_by_name("Homer").groupizations.each {|groupization| 
                 puts groupization.group.org + ': ' + groupization.role}

User Load (2.8ms)  SELECT "users".* FROM "users" WHERE "users"."name" = 'Homer' LIMIT 1
Groupization Load (1.5ms)  SELECT "groupizations".* FROM "groupizations" WHERE 
"groupizations"."user_id" = 2

Group Load (1.9ms)  SELECT "groups".* FROM "groups" WHERE "groups"."id" = 1 
LIMIT 1

The Movementarians: cult follower

Group Load (1.4ms)  SELECT "groups".* FROM "groups" WHERE "groups"."id" = 2 
LIMIT 1

Nuclear Plant: employee

最后一个想法(有点微不足道)“分组”当然有效,但如果“角色”是您要添加的唯一属性,那么更具体地命名关系模型(例如“成员资格”)具有实际好处,因为它至少在我的经验中,使关系更加清晰。

于 2012-05-13T12:10:35.143 回答