1

初めて、Rails アプリケーションで HABTM 関係を使用しようとしています。次の図は、モデルとそれらの相互関係を示しています。

スキーマ

現在、リージョン内のすべてのメンバーを次のように表示しています。

<% @region.members.each do |member| %>
  <%= link_to member.name, member %>
<% end %>

メンバーのリストをそれぞれのレベルでソート/順序付けしようとしています。次に、メンバーをアルファベット順で並べ替えたいと思います。

したがって、 members_controller コードが現在のデフォルトです。

@members = Member.all

結果をアルファベット順に並べ替えることができます。

@members = Member.order("name DESC").all

しかし、関連モデルのデータを使用してメンバー レコードを並べ替える方法がわかりません。3 つのレベルがある可能性があります。チャリティー、ベーシック、サブスクリプション。ページの上部に、サブスクリプション メンバーのみを表示するブロックを配置する予定です。その後、サブスクリプション メンバーはページに再度表示されません。

@subscribed_members = Member.where(:level == 1).order("name DESC").all

しかし、ご覧のとおり、そのブロックをレベルでフィルタリングする方法がわかりません。

誰かが私を正しい方向に向けることができますか、それともこのためのチュートリアルに向けることができますか? HABTM関係のRailsガイドを読みましたが、モデルのみをカバーしているようです。

編集

提案を試した後、次のようになりました。

@members = Member.all
@subscribedmembers = Member.include(:levels)
                         .where("levels.name == 'subscriber'")

地域ビューでその方法を使用するにはどうすればよいですか?

<% @region.subscribedmembers.each do |member| %>
   <%= member.name %>
<% end %>

存在しない subscrivedmembers という関連モデルを探しているため、これは機能しません。

4

1 に答える 1

0

この種のタスクについては、 でモデルを結合する方法を検討することをお勧めしますActiveRecord。メソッドはincludejoinsです。Lemme は、コードの一部を示しています。

@subscribed_members = Member.include(:levels)
                            .where("members.url == 'test_url'")
                            .order("levels.name DESC")

このクエリの実行後にコンソールを確認includeすると、 が 2 つのテーブルと SQL 結合を行っていることがわかります。ここでは を想定しmember :has_many :levelsているので、テーブルを含めて、句:levelsに接頭辞付きの列名を使用します。 アイデアが分かればそれほど難しいことではないので、コンソールでこれら 2 つの方法を試して結果を確認することをお勧めします。order

編集

クエリ コードでスコープを作成し、任意の場所で使用します。例:

# On your model
scope :ultimate_level, include(:levels).where("name = 'test'").order("levels.name DESC")

# On your controller
@subscribed = Member.ultimate_level

# On your view
<% @subscribed.each do |s| %>

それぞれが単一の操作を行うさまざまなスコープを作成して、コントローラーなどで再利用することもできます。 Obs .: 構文を確認してください。コードを自分でテストしていません。

于 2012-12-27T23:07:23.540 に答える