我正在考虑的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
那是一个正确的做法? 我知道的语法错误(我试过); 将正确的语法是什么样的? 谢谢!
在用户模式,你必须是这样的:
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)
然后从那里你可以得到你想要的角色。
我不认为有一个优雅的方式来做到这一点,仅仅是这样的:
user.groupizations.find_by_group_id(user.groups[0].id).role
你给的例子代码[0]
似乎不是一个现实的使用,所以如果你向我们展示了如何你实际上是想要访问role
,有可能是一个更清洁的方式。
这是讨论在这里 。
这个最好的方法是用联接模型,然后委托/代理方法到组,如工作:
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>
这样,只需要三个查询 - 每一个用户,组和成员。
目前尚不清楚你在找什么究竟,所以我会抛出另一个例子与控制台输出,使之更加明显什么发生。 重点是,然而,得到的只是一个用户的角色(一个或多个),你需要指定你的意思是,用户团体(如由@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