3

私は次のモデルを持っています:

class Person < ActiveRecord::Base
 has_many :images
 has_one :preference
end

class Image < ActiveRecord::Base
 belongs_to :person
end

class Preference < ActiveRecord::Base
 belongs_to :person
end

公開されているすべての画像を取得しようとしていると同時に、それらの画像を所有している人々を熱心に読み込もうとしています:

    Image.find(:all, :conditions =>  ["images.person_id = ? AND preferences.image_privacy = ?", user.id, PRIVACY_PUBLIC],
               :joins => [:person => :user_preference], :include => :person)

Rails は :include を好まないようです (:person が 2 つのモデルで参照されているためだと思います)。これは私が得るエラーです( :include オプションをドロップすると消えます):

"ActiveRecord::StatementInvalid: Mysql::Error: 一意のテーブル/エイリアスではありません: 'people'"

実際の JOIN コマンドを文字列として書き出して :include オプションに渡すことでこれを回避できますが、これは Rails-y ではないため、これを行うためのよりクリーンな方法があることを望んでいました。

どんな助けでも大歓迎です。

ありがとう!

4

4 に答える 4

2

user_preferences ではなく、「preferences」と呼んでいるようです。したがって、参加する必要があります:

:joins => [:person => :preference])
于 2009-09-29T14:05:14.933 に答える
0

JOINを使用すると、Peopleテーブルを積極的に含めることができるため、「include」を再度追加する必要はありません。これは機能するはずです:

  Image.find(:all, :conditions =>  ["images.person_id = ? AND preferences.image_privacy = ?", user.id, PRIVACY_PUBLIC],
           :joins => [:person => :user_preference])
于 2009-09-26T16:07:17.803 に答える
0

これはテーブルエイリアシングの問題である可能性があります。railsdocにはテーブルエイリアシングに関する詳細があります。

また、ここにSQLを投稿することも役に立ちます。

于 2009-09-26T18:11:56.990 に答える
0

:conditions => ["images.person_id", user.id] と書き、画​​像とそれらの画像を所有するをロードしたいと言いました。しかし、user.id を 1 つしか指定していないため、1 人のユーザー (グループのユーザーではなく) に属する画像を読み込んでいるように見えます。

私はこのようにします:

Person.find(user.id, :include => [:images, :preference], :conditions => ["preferences.image_privacy = ?", PRIVACY_PUBLIC])

人物とその画像を読み込みます。

おそらく、私はあなたの問題を正しく理解していません。

条件を使用する代わりに、named_scopeを試すことができます

于 2009-09-29T14:23:23.227 に答える