虽然使用在的has_many关系时访问额外的属性在连接表(Access extra attribut

2019-07-29 09:16发布

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

例如,我有一个用户表和组表。 用户可以通过加入群:通过的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 

那是一个正确的做法? 我知道的语法错误(我试过); 将正确的语法是什么样的? 谢谢!

Answer 1:

在用户模式,你必须是这样的:

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。

得到一个特定的用户/组的关系可能就像这样:

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

然后从那里你可以得到你想要的角色。



Answer 2:

我不认为有一个优雅的方式来做到这一点,仅仅是这样的:

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

你给的例子代码[0]似乎不是一个现实的使用,所以如果你向我们展示了如何你实际上是想要访问role ,有可能是一个更清洁的方式。

这是讨论在这里 。



Answer 3:

这个最好的方法是用联接模型,然后委托/代理方法到组,如工作:

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>

这样,只需要三个查询 - 每一个用户,组和成员。



Answer 4:

目前尚不清楚你在找什么究竟,所以我会抛出另一个例子与控制台输出,使之更加明显什么发生。 重点是,然而,得到的只是一个用户的角色(一个或多个),你需要指定你的意思是,用户团体(如由@BuckDoyle,虽然他只是拿起第一个反映您的例子) 。 要获得所有用户的角色列表,你需要遍历用户的groupizations。

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

最后一个思想(一种微不足道的一)“groupizations”当然有效,但如果“角色”是唯一的属性,你要添加,更具体命名的关系模型(说“成员”)在其实际的好处使关系更清晰一点,在我的经验,至少。



文章来源: Access extra attributes in join table when using though in has_many relationship