71

Ruby と Rails はどちらも初心者ですが、今では本で教育を受けています (これはどうやら何の意味もありませんね、笑)。

テーブル EventUser を介して結合された Event と User の 2 つのモデルがあります。

class User < ActiveRecord::Base
  has_many :event_users
  has_many :events, :through => :event_users
end

class EventUser < ActiveRecord::Base
  belongs_to :event
  belongs_to :user

  #For clarity's sake, EventUser also has a boolean column "active", among others
end

class Event < ActiveRecord::Base
  has_many :event_users
  has_many :users, :through => :event_users
end

このプロジェクトはカレンダーであり、特定のイベントにサインアップして名前を書き留める人々を追跡する必要があります。多対多は良いアプローチだと思いますが、次のようなことはできません。

u = User.find :first
active_events = u.events.find_by_active(true)

イベントは実際にはその余分なデータを持っていないため、EventUser モデルは持っています。そして、私ができる間:

u = User.find :first
active_events = []
u.event_users.find_by_active(true).do |eu|
  active_events << eu.event
end

これは「レールウェイ」に反するようです。これは今夜(今朝)長い間私を悩ませてきましたか?

4

4 に答える 4

124

User モデルにこのようなものを追加するのはどうですか?

has_many  :active_events, :through => :event_users, 
          :class_name => "Event", 
          :source => :event, 
          :conditions => ['event_users.active = ?',true]

その後、次のように呼び出すだけで、ユーザーのアクティブなイベントを取得できるはずです。

User.first.active_events
于 2009-01-03T11:05:04.703 に答える
12

u.eventsがuser_eventsテーブルを明示的に呼び出していない場合でも、必要な結合があるため、そのテーブルはSQLに暗黙的に含まれています。したがって、検索条件でそのテーブルを引き続き使用できます。

u.events.find(:all, :conditions => ["user_events.active = ?", true])

もちろん、このルックアップを頻繁に行う予定がある場合は、Milan Novotaが提案するように、別の関連付けを指定してください。ただし、そのようにする必要はありません。

于 2009-01-03T12:43:10.790 に答える