2013-10-02 7 views
0

У меня есть две модели: работа и пользователь.Несколько ассоциаций от одной модели к той же модели

class Job < ActiveRecord::Base 
end 

class User < ActiveRecord::Base 
end 

Я хочу работу, чтобы иметь как «владелец», который относится к пользователю и список пользователей, которые назначены на работу.

В принципе, я хочу, чтобы быть в состоянии сделать:

job.owner # return user 
job.users # returns users 

Что такое правильный способ моделирования это с ActiveRecord ассоциаций?

ответ

1

Большая часть магии с ассоциациями Rails вычисляет имя класса для вас. Однако вы можете указать его самостоятельно, если вам нужно.

Вот что схема должна выглядеть следующим образом:

create_table :jobs do |t| 
    t.integer :owner_id 
end 

create_table :users do |t| 
    t.references :job 
end 

А вот то, что модели должны выглядеть

class Job < AR::Base 
    belongs_to :owner, class_name: "User" 
    has_many :users 
end 

class User < AR::Base 
    belongs_to :job 
end 
+0

Чтобы сделать его полным, можно также показать, как настройки класса User, чтобы правильно определить отношения, и какие столбцы необходимы (миграция). Или ссылку на материал (guide.rubyonrails.org?) С дополнительной информацией – MBO

+0

Как выглядит схема работы? Может ли эта ассоциация ожидать, что Job будет иметь user_id или что-то вроде owner_id? – skalb

+1

Нашел ответ здесь: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference, вы можете указать его. – skalb

0

Я думаю, вы можете другую модель здесь, так что пользователи могут иметь рабочие места в два разных контекста - как владельцы заданий, так и рабочие пользователи.

Я хотел бы попробовать что-то вроде этого:

# Setup user model (users own jobs) 
class User < ActiveRecord::Base 
    has_many :jobs 
    has_many :user_job_subscriptions 
end 

# Setup job model 
class Job < ActiveRecord::Base 
    belongs_to :user 
    has_many :user_job_subscriptions 
end 

# Setup job subscription model (users can also have/subscribe to jobs) 
class UserJobSubscriptions < ActiveRecord::Base 
    attr_accessible :user, :job 
    belongs_to :user 
    belongs_to :job 
end 

Кроме того, здесь удивительным видео (это немного устарел, но это нормально), который поможет вам понять различные типы ассоциаций, доступных для вас - и почему/когда использовать их: http://railscasts.com/episodes/47-two-many-to-many

+0

Есть ли какое-то преимущество в том, что UserJobPublications против наличия ссылки user_id на работу? – skalb

+0

Ну, если вы планируете хранить больше данных в публикациях вакансий - конечно, но, если вы просто используете его для присоединения к пользователям, вам не нужно. Я упростил подход выше. Может быть, попробовать? – cmw

1
class Job < ActiveRecord::Base 
    belongs_to :owner, class_name: User 
    has_many :users 
end 

class User < ActiveRecord::Base 
    has_many :owned_jobs, class_name: Job 
    belongs_to :job 
end 

Таким образом, у вас есть:

@user.job 
@user.owned_job 

@job.owner 
@job.users 

также создают колонны, как это:

class SomeMigration 
    def change 
    add_column :jobs, :owner_id, :integer 
    add_column :users, :job_id, :integer 
    end 
end 

Вы можете прочитать здесь: http://guides.rubyonrails.org/association_basics.html

Смежные вопросы