0

まずは話題。

次のような has_many :trough 関連付けで相互にリンクされている 3 つのモデルがあります。

#User model 

has_many :chars_del, :class_name => CharDelegated, :dependent => :destroy
has_many :chars, :through => :chars_del

#CharDelegated model
#has a field owner:integer

belongs_to :char
belongs_to :user

#Char model
#has fields name:string

has_many :chars_del, :class_name => CharDelegated
has_many :users, :through => :chars_del

私がする必要があるのは、特定のユーザーが所有するすべての文字 (:owner フィールドが true) を名前順に並べて見つけるために、ユーザー レコードから検索する必要があることです。私はこれで数時間立ち往生しているので、非常に単純な答えを見逃していた可能性があると思います...しかし、これまでに試したことは何もうまくいきませんでした。

UPDATE は機能するものを見つけました:

user.chars.where(:char_delegateds => {:owner => 1}).order('name')

:chars_del でエラーが発生した理由はわかりませんが、完全なテーブル名でうまくいきました。

アンドリュー、あなたの答えもうまく機能し、データベース上で少し高速です。

4

2 に答える 2

0

する

user.chars.order('name')

うまくいかない?(与えられuserたのは単一のUserインスタンスです。)

編集

あなたの新しい情報を考えると:

CharDelegated.where(user_id: user.id, owner: true).map(&:char)

動作するはずです。

于 2012-03-04T18:16:10.950 に答える
0

特定の例では、中央のテーブルを検索する必要はありませんが、結合テーブルの使用方法の例を表示し、より複雑なシナリオを検索する場合は、この方法で実行できます。

@char = Char.all(:include => :users, :conditions => ["char_delegated.user_id in (?)", user_id]).order('name')

于 2013-01-21T14:45:41.070 に答える