1

少し行き詰まる状況があります。

投稿には (作成者として) ユーザーを含めることができ、投稿には多くのユーザーを含めることもできます (投稿には他のユーザーをタグ付けすることができるため)。

私の投稿モデルでは:

belongs_to :user
has_and_belongs_to_many :users

私のユーザーモデルでは:

has_and_belongs_to_many :posts

一般的には問題なく動作しますが、投稿クエリにユーザーを含め、投稿を作成者の名前で並べ替えると、かなり行き詰まります。

正しい設計とは?おそらく Post の user_id を author_id に置き換えますか?

4

1 に答える 1

1

私はあなたの結合を想像UserしてUsers台無しにすることができます。しかし、私の経験では、これは Rails ではうまく解決できないものです。名前を変更するだけではauthor(読みやすさが向上し、意図をより適切に表現できますが)、同じ table を指しているため、役に立ちませんusers

レールで複数の結合を行う場合、条件を正しく表現するのは非常に困難です。Rails はその場でテーブルのエイリアスを作成しますが、残念ながら、私の条件ではこれらのエイリアスに対処する方法が見つかりません。

したがって、手作りのSQL(高速)に頼るか、レールを使用して、最初に投稿者名でソートされた投稿を取得してから、投稿ごとにタグ付けされたユーザーのリストを取得する必要があると思います(これは遅くなります) 、しかし純粋なルビー)。

最初に 2 番目のオプションを選択し、必要に応じて最初のオプションを最適化します。

[更新: スコープ定義を追加]

個人的には、私は賛成せずdefault_scope、代わりに明示的なスコープを定義することを提案します

scope :with_authors_sorted, lambda { 
  Post.includes(:type).includes(:user).
       order('year DESC, week DESC, users.display_name ASC, posts.created_at DESC') 
}

これは、コントローラーで使用できます。

@posts = Post.with_authors_sorted

お役に立てれば。

于 2011-10-05T13:14:57.103 に答える