0

Railnoobの質問を許してください。関連するレコードのリストを表示しようとしていますが、反対方向の関連を処理するのに問題があります。

たとえば、私は

Country
  has_many :states
  has_many :users, :through => :events
  has_many :venues, :through => :events
  has_many :users
  has_many :venues
end

State
  belongs_to :country
  has_many :cities
end

City
  belongs_to :state
  has_many :events
end

Event
  belongs_to :city
  belongs_to :user
  belongs_to :venue
end

Venue
  has_many :events
  belongs_to :country
end

User
  has_many :events
  belongs_to :country
end

カントリーショービューでは、すべてのイベント、すべての会場、およびすべてのユーザーを一覧表示しようとしています。

イベントは簡単です

@country = Country.find(params[:id])
@events = @country.states.cities.events.find(:all)

しかし、ユーザーと会場を一覧表示するための最良のアプローチを視覚化するのに苦労しています。

要件は次のとおりです。

  • 個々のユーザー/会場は、重複することなく1回リストする必要があります。
  • ユーザー/会場は、イベントの数に基づいて注文する必要があります(現在の国の場合、合計ではありません)。

これはかなり簡単なはずですが、のさまざまな順列で遊んだ後、events.includes(:user)必要.select("DISTINCT(ID)").order(user.events.length)クエリを生成できませんでした。

私はおそらくこれで精神的な轍に引っかかっていると思います。私が正しいラックにいるかどうかを確認するために、コミュニティからいくつかの考えやアイデアを形成していただければ幸いです。

ありがとう!

編集

もう少し考えてみると、私の問題は、国とユーザーの間に2つの関連付け、イベントを介した関連付け、およびアドレスの一部としての直接の関連付けがあることから生じていると思います。上記のモデルの説明を更新しました。

この結果、国のショーページで、住所ではなくイベントを通じて国に関連付けられているユーザーを確実に一覧表示するにはどうすればよいですか?

また、重複したユーザーを取得しています。使用してみまし.uniq?たが、エラーが返される場合があります。これまで使用した方が適切と思われる'nil' is not an ActiveModel-compatible object that returns a valid partial path.場合もあります。:select => "DISTINCT(ID)"しかし、データベースとの対話方法に関して、これら2つのアプローチの違いは何ですか?

4

1 に答える 1

3

:throughオプションwithを使用し:has_manyて、深く関連付けられたレコードにすばやくアクセスします。

Country
  has_many :states
  has_many :cities, through: :states # <-
  has_many :events, through: :cities # <-
  has_many :users, through: :events # <-
end

State
  belongs_to :country
  has_many :cities
  has_many :events, through: :cities # <-
  has_many :users, through: :events # <-
end

City
  belongs_to :state
  has_many :events
  has_many :users, through: :events # <-
end

そして、あなたは簡単にタイプすることができます:@country.users

UPD:

国のイベントのすべてのユーザーを取得するには、次のことを試してください。

User.where(id: @country.events.uniq.pluck(:user_id))
于 2012-04-13T05:44:14.883 に答える