Создание нескольких отношений один-ко-многим в рельсах - PullRequest
1 голос
/ 04 января 2011

Этот вопрос почти отвечает на него, но я все еще думаю, что это излишне. Проблема с Rails отношениями has_many

Я действительно просто хочу выполнять задания, подобные этому

@user.browsing_location = location1
@user.home_location = location2

Я много гуглял, и вся информация противоречива, или объясняет настройку многих-многих отношений, и объясняет методы с использованием промежуточной таблицы. Но на самом деле все, что нужно базе данных, - это чтобы в пользовательской таблице было два поля идентификаторов с разными именами. Будет ли что-то вроде следующей работы?

Класс пользователя

  class User < ActiveRecord::Base
  #locations created by this user
  has_many :locations, :foreign_key => :creator_id

  #locations for browsing and visiting
  belongs_to :browsing_location, :source => :location
  belongs_to :home_location, :source => :location

end

Класс местоположения

class Location < ActiveRecord::Base
  #Users who are just browsing this location now
  has_many :browsing_users, :foreign_key => :browsing_location_id, :source => :users
  #Users who are living here now
  has_many :home_users, :foreign_key => :home_location_id, :source => :users

  #User who created this location
  has_one :user
end

Довольно многим моим моделям понадобятся такие отношения, поэтому я хотел бы избежать создания дополнительных таблиц для этого.

1 Ответ

0 голосов
/ 27 января 2011

Похоже, вы пытаетесь получить две таблицы, которые наследуют класс местоположения, browsing_location и home_location, и две таблицы, которые наследуют класс пользователя, browsing_user и home_user.Для Rails 3:

У вас есть общая идея, но, похоже, вы немного перепутали.: source используется для многих-многих отношений, чтобы определить, какую ассоциацию использовать.Вместо этого вам, по-видимому, нужно: имя_класса

Мне нужно просмотреть определения вашей таблицы для пользователей и местоположений, чтобы убедиться, что вы правильно используете атрибут: foreign_key.

user.rb

class User < ActiveRecord::Base
  # locations created by this user
  has_many :locations, :foreign_key => :creator_id

  # I'm assuming the locations belong to the user, as you're end goal was stated as  
  # the ability to call set user.browsing_location and user.home_location 
  # that would mean that browsing_location and home_location would need to belong to
  # the User class, not the other way around.  
  has_many :browsing_locations, :class_name => :location
  has_many :home_locations, :class_name => :location

end

class Location < ActiveRecord::Base

  # User who created the location
  belongs_to :user

  # Users who are just browsing this location now
  has_many :browsing_users, :class_name => :users
  # Users who are living here now
  has_many :home_users, :class_name => :users

end
...