ActiveRecord: имеет много через (дважды) - PullRequest
2 голосов
/ 12 августа 2011

Есть Thing s в Place s, которые я ищу, чтобы найти. Один Thing может быть во многих разных Place с, а многие Thing с могут быть в одном Place.

class Thing < ActiveRecord::Base
  has_and_belongs_to_many :places
end

class Place < ActiveRecord::Base
  has_and_belongs_to_many :things
end

Я хочу записать Find s моих User s, чтобы я знал, где они что нашли.

class Find < ActiveRecord::Base
  belongs_to :user
  belongs_to :places_thing # Is this depluralization correct?
end

class User < ActiveRecord::Base
  has_many :finds
  # Now, how can I link in the Things the user has found? Like this?
  has_many :found_things_in_places, :class_name => :places_things, :through => :finds
  has_many :things, :through => :thought_things_in_places
end

Это кажется правильным? это эффективно? Спасибо.

1 Ответ

5 голосов
/ 15 августа 2011

Я думаю, что вы на правильном пути, большое изменение, которое я бы сделал, заключается в том, что вместо таблицы соединений (place_things) вы должны сделать ее подходящей моделью.Я решил назвать это существованием.

Данные существуют только в одном месте, поэтому они должным образом нормализованы.Эти отношения понятны и ими будет легко управлять.Я думаю, что это эффективно.

class Place < ActiveRecord::Base
  has_many :existences
  has_many :things, :through => :existences
end

class Thing < ActiveRecord::Base
  has_many :existences
  has_many :places, :through => :existences
end

class Existence < ActiveRecord::Base
  belongs_to :place
  belongs_to :thing
end

class Find < ActiveRecord::Base
  belongs_to :user
  belongs_to :existence
end

class User < ActiveRecord::Base
  has_many :finds
  has_many :existences, :through => :finds
  has_many :things, :through => :existences
end

Вам понадобятся рельсы 3.1, чтобы у вложенных было много сквозных, как у нас в User.

Кстати, правильная декларация ассоциации должна быть:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...