2012-01-16 38 views
13

我有3个表 - 用户,事物,并遵循。用户可以通过下表进行关注,将user_idthings_id关联。这将意味着:需要来自rails连接表的数据,has_many:通过

class User 
    has_many :things, :through => :follows 
end 

class Thing 
    has_many :users, :through => :follows 
end 

class Follow 
    belongs_to :users 
    belongs_to :things 
end 

所以我可以检索thing.users没有问题。我的问题是,如果在下面的表中,我有一个名为“关系”的列,所以我可以设置一个关注者为“管理员”,我想访问该关系。因此,在一个循环中我可以这样做:

<% things.users.each do |user| %> 
    <%= user.relation %> 
<% end %> 

有没有一种方法,包括关系到原来的用户对象?我试过:select => "follows.relation",但它似乎没有加入属性。

+2

它是一个非常糟糕的主意来命名关系“关系”......这可能会打破一些ruby内部,你会得到意想不到的行为! – Lichtamberg 2012-01-16 00:44:58

+0

好的,谢谢。可以说这个列被命名为“is_admin”并且有一个布尔类型.. – 2012-01-16 00:57:07

回答

22

为此,您需要在has_many中使用一点SQL。像这样的东西应该有希望工作。 has_many :users, :through => :follows, :select => 'users.*, follows.is_admin as is_follow_admin'

然后在循环中,你应该有机会获得 user.is_follow_admin

+0

绝对有效,并且基本上是我以前尝试的。我的挂断是,在命令行上执行此操作时,SQL转储不会在任何地方显示is_admin属性。它只显示以下对象。谢谢! – 2012-01-16 01:20:33

+0

+1 - 布拉德利牧师,你已经做到了。 – 2012-09-08 13:31:56

+0

+1巨大的节省时间和非常优雅,谢谢! – 2012-12-06 19:46:26

0

你也许能够做一些事情,如:

<% things.follows.each do |follow| %> 
    <%= follow.relation %> 
    <%= follow.user %> 
<% end %> 
8

对于使用轨道4人,的用法:顺序:选择等已被弃用。现在你需要指定如下:

has_many :users, -> { select 'users.*, follows.is_admin as is_follow_admin' }, :through => :follows