0

3つのデータテーブルと2つの結合テーブルがあり、すべてを接続しています。結合テーブルのデータが同じであるという条件に基づいて結果をクエリする方法を見つけようとしています。

説明するために、ユーザー、インタレスト、およびイベントのテーブルがあります。これらのテーブルは、HABTM関係(他のフィールドを格納する必要がないため、私のニーズには適しています)を介してリンクされ、2つの結合テーブルを介して結合されます。したがって、(user_id、interest_id)を含むUsersInterestsテーブルと(event_id、interest_id)を含むEventsInterestsテーブルもあります。

問題は、ユーザーの関心がイベントの関心と一致するすべてのイベントをクエリしようとしたときに発生します。

こんな感じになると思いました…

 @events= Event.find(:all, :conditions => [@user.interests = @event.interests])

しかし、「nil:NilClassの未定義のメソッド `interests'」というエラーが表示されます。構文またはロジックに問題がありますか?

4

3 に答える 3

1

問題は、@userまたは@eventのいずれかが未定義であるということです。それらを定義しても、このステートメントを実行する前に、提供された条件オプションは無効です[@user.interests = @event.interests]

イベントのこの名前付きスコープはトリックを行う必要があります

class Event < ActiveRecord::Base
  ...
  named_scope :shares_interest_with_user, lambda {|user|
    { :joins => "LEFT JOIN events_interests ei ON ei.event_id = events.id " +
         "LEFT JOIN users_intersets ui ON ui.interest_id = ei.interest_id",
      :conditions => ["ui.user_id = ?", user], :group_by => "events.id"
    }
end

@events = Event.shares_interest_with_user(@user)
于 2010-02-15T08:43:15.617 に答える
0

ユーザーEvent <-> Interest <-> Userの関心がイベントの関心と一致するすべてのイベントをクエリすると、(以下は、このイベントの関心が少なくとも1人のユーザーの関心でもあるようなすべてのイベントを検索します)。

まず、うまくいく可能性のある最も簡単なことを試してください。

@events = []
Interest.all.each do |i|
  i.events.each do |e|
    @events << e if i.users.any?
  end
end
@events.uniq!

非常に非効率的で、リソースを大量に消費し、CPUを集中的に使用します。多くのSQLクエリを生成します。しかし、仕事を成し遂げます。

2回目の試行では、複雑な結合を組み込む必要がありますが、考えれば考えるほど、問題がどれほど曖昧であるかがわかります。より正確に。

于 2010-02-15T20:43:22.823 に答える
0

あなたがやろうとしていることを完全にフォローしているのかわかりません。1人のユーザーがいて、そのユーザーも関心を持っているすべてのイベントが必要な場合は、次のようになります。

Event.find(:all, :include => [:events_interests], :conditions => ['events_interests.interest_id in (?)', @user.interests.collect(&:id)])

おそらく動作するはずです。

于 2010-02-15T21:11:37.883 に答える