По моему мнению, то, что у вас уже есть, является почти правильным, за исключением того, что вы сохраняете внешний ключ домашнего состояния для пользователя следующим образом:
# user.rb
class User < ActiveRecord::Base
belongs_to :state
has_many :visits
has_many :states, through: visits
end
# visit.rb
class Visit < ActiveRecord::Base
belongs_to :user
belongs_to :state
end
# state.rb
class State < ActiveRecord::Base
has_many :visits
has_many :users, through: :visits
end
После этого вы получите доступ к домашнему состоянию, как показано ниже:
u = User.first
u.state
И посещенные состояния, вроде так:
u = User.first
u.states
Для ясности программирования вы можете переименовать ваши отношения:
# user.rb
class User < ActiveRecord::Base
belongs_to :home_state, class_name: "State"
has_many :visits
has_many :visited_states, class_name: "State", through: visits
end
# state.rb
class State < ActiveRecord::Base
has_many :residents, class_name: "User"
has_many :visits
has_many :visitors, class_name: "User", through: :visits
end
Ваша модель домена будет иметь больше смысла:
u = User.first
u.home_state
u.visited_states
s = State.first
s.residents
s.visitors
Полагаю, вы, вероятно, захотите сохранить дополнительную информацию о посещении, поэтому сохранение таблицы соединений HMT для модели Visit
позволит вам сделать это, а не переходить с отношения HABTM. Затем вы можете добавить атрибуты для посещения:
# xxxxxxxxxxxxxxxx_create_visits.rb
class CreateVisits < ActiveRecord::Migration
def change
create_table :visits do |t|
t.text :agenda
t.datetime commenced_at
t.datetime concluded_at
t.references :state
t.references :user
end
end
end