2012-01-16 3 views
13

私は3つのテーブルを持っています。ユーザーはuser_idthings_idを関連付けることで、後続の表を参照できます。これは意味する:rails join tableからのデータが必要です、has_many:through

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を取り戻すことができる。私の問題は、次の表に「relation」という名前の列があるため、フォロワーを「管理者」として設定できるため、その関係にアクセスしたいと考えています。ループの中で私は次のようなことをすることができます:

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

オリジナルのユーザーオブジェクトにリレーションを含める方法はありますか?私は:select => "follows.relation"を試しましたが、属性に参加していないようです。

+2

その本当に悪い考えを関係「関係」という名前を付けるために...これは、いくつかのルビーの内部を壊して、あなたが予期しない動作を取得します! – Lichtamberg

+0

申し訳ありません、ありがとうございます。列が "is_admin"という名前でブール型の型を持っているとします。 –

答えて

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属性をどこにも表示しないということでした。それは単にfollowingオブジェクトを示しています。ありがとうございました! –

+0

+1 - ブラッドリー・プリースト、もう一度やりました。 –

+0

+1巨大な時間の節約と非常にエレガント、感謝! –

0

へのアクセス権を持つ必要があります、レール4を使用している人々のための使用

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

を:順序を、: selectなどは廃止されました。今、あなたは次のように指定する必要があります。

has_many :users, -> { select 'users.*, follows.is_admin as is_follow_admin' }, :through => :follows 
関連する問題