1

Ruby on Railsで横方向の祖父母をクエリするにはどうすればよいですか?

たとえば、次のモデルを設定しています。

ユーザー

class User < ActiveRecord::Base
   has_many :registrations
end

登録

class Registration < ActiveRecord::Base
   belongs_to :user
   belongs_to :competition
end

コンペ

class Competition < ActiveRecord::Base
  has_many :registrations
  belongs_to :tournament
end

トーナメント

class Tournament < ActiveRecord::Base
  has_many :competitions
end

だから私がしたいのは、特定のトーナメントに属する登録を持っているすべてのユーザーを見つけることです。これを行うために私が知っている唯一の方法は、すべてのユーザーを見つけ、各ユーザーをループしてから、各ユーザーに次のように個々の登録を照会することです...

<% @users.each do |user| %>
    <% if user.registrations..joins(:competition).where("competitions.tournament_id = #{params[:tournament]}").count > 0 %>
        print out user information...
    <% end %>
<% end %>

これは本当の半分のように思えます-私は必要のないレコードを選択しているので、あなたは物事をどのように行うかを知っています、誰かがこれを達成するためのより良いもっとRailsyの方法を提案できますか?

4

1 に答える 1

2

より「Railsy」なソリューションを作成するための最初のステップは、クエリ ロジックをビューからモデル レイヤーに移動することです。次の 2 つのクエリを Tournament モデルに追加できます。

class Tournament < ActiveRecord::Base
  has_many :competitions

  def registrations
    regs = []
    self.competitions.each do |competition|
      competition.registrations.each do |registration|
        regs << registration
      end
    end
    regs
  end

  def users
    usrs = []
    self.registrations.each do |registration|
      usrs << registration.user
    end
    usrs
  end

end

ビュー内で次のことができるようになりました。

<% @tournament.users.each do |user| %>
  User: <%= user.name %><br />
<% end %>

必要に応じて、トーナメントのすべての登録を返すメソッドもあります。これが別のアプローチを見るのに役立つことを願っています。

于 2012-06-22T05:59:40.637 に答える