rails has_many через независимую сквозную таблицу - PullRequest
1 голос
/ 25 сентября 2010

У меня есть модель пользователя, модель человека и модель компании.

Пользователь имеет много компаний через Персона и наоборот.

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

class User < ActiveRecord::Base
  attr_accessible :name
  has_many :people
  has_many :companies, :through => :people
end

class Person < ActiveRecord::Base
  attr_accessible :user_id, :company_id
  belongs_to :users
  belongs_to :companies
end

class Company < ActiveRecord::Base
  attr_accessible :name
  has_many :people
  has_many :users, :through => :person
end

сейчас в консоли я хочу сделать следующее

User.find(1).companies

тогда мне должны найти компании, в которых пользователь (1) представляет интерес.

Я правильно понял, есть ли небольшое изменение, которое я должен сделать.

Ответы [ 2 ]

1 голос
/ 25 сентября 2010

Ваша модель Person не может напрямую "принадлежать" более чем одной, ваши ассоциации belongs_to :users и belongs_to :companies не будут работать таким образом. Компании-люди должны быть связаны через другую таблицу соединений, которая описывает отношения между ними, например Занятость , которая указывает на один экземпляр каждой модели:

class Person < ActiveRecord::Base
  has_many :employments
  has_many :companies, :through => :employments
end

class Employment < ActiveRecord::Base
  belongs_to :person
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :employments
  has_many :people, :through => :employments
end

Затем вы можете использовать опцию :through, чтобы связать множество компаний / людей по другую сторону этих трудовых отношений в середине.

Точно так же, если Персона может принадлежать более чем одному Пользователю, вам также понадобится модель соединения между этими двумя сущностями.

0 голосов
/ 01 июля 2013

Точно так же в отношениях has_many :through нет ничего, что говорило бы о том, что вы не можете использовать свою таблицу соединений (в вашем случае Person ) независимо.По характеру отношений вы объединяетесь через совершенно отдельную модель ActiveRecord, которая наиболее заметно отличает ее от отношения has_and_belongs_to_many.

Как указал Брэд в своем комментарии, вам необходимо использовать множественное число «личность»«людям» в ваших отношениях.Кроме этого, похоже, что вы настроили его правильно.Предоставление :user_id и :company_id с помощью attr_accessible позволит вам массово назначать эти значения позже из обратной передачи, но часто вы хотите уклониться от этого с ассоциациями на основе ролей, так как вы можете не захотеть уходитьони подвержены потенциальным атакам HTTP Post.

Помните, что в вашем контроллере вы всегда можете сделать что-то подобное с или без attr_accessible:

@person = Person.new
@person.user = User.find(...)
@person.company = Company.find(...)
@person.save

Надеюсь, что это поможет.

...