2016-02-01 3 views
1

Я пишу базовое приложение CRM для изучения Ruby on Rails 4.2, и у меня есть нечетная пара ассоциаций (или, может быть, не так странно). Если бы это был прямой SQL и другая платформа, это было бы просто, но я не уверен, правильно ли я делаю это в ROR.Является ли эта связь Rails между компанией и сотрудником действительной?

Бизнес-требование состоит в том, что каждая компания имеет одного или нескольких пользователей. Достаточно просто. (Соответствующие части приведенной ниже модели.)

user.rb  
belongs_to :company 

company.rb 
has_many :users 

Дополнительным требованием является то, что каждая компания может иметь одного основного пользователя. Мне нужно иметь возможность ссылаться на информацию пользователя (имя, адрес электронной почты и т. Д.) В индексе компаний и показать представление. Здесь я немного неопределен. Если модели выглядеть следующим образом (это не имеет смысла для меня, но я не могу думать иначе) ?:

user.rb 
belongs_to :company 

company.rb 
has_many :users 
has_one :user 

Вот сокращенная схема. Пользователь user_id в компаниях является FK для хранения «первичного контакта»:

create_table "companies", force: :cascade do |t| 
    t.string "companyname" 
    t.integer "user_id" 
end 

create_table "users", force: :cascade do |t| 
    t.string "username" 
    t.string "email" 
    t.string "phone" 
    t.integer "company_id" 
end 

Благодарим за помощь.

ответ

0
user.rb  
belongs_to :company 

company.rb 
has_many :users 
**belongs_to :primary_user, class_name: "User"** 

в компании вы должны иметь primary_user_id столбец. Вы можете также определить HAS_ONE на пользователя, как это:

user.rb  
belongs_to :company 
**has_one :primary_company, class_name: "Company", foreign_key: "primary_user_id"** 

company.rb 
has_many :users 
belongs_to :primary_user, class_name: "User" 
+0

Спасибо Vijay, я собираюсь попробовать оба подхода в ближайшее время. Чтобы быть как можно более простым, вы бы пошли с первым или вторым вариантом? Чтобы быть ясным: компания ** не ** должна иметь первичного контакта/пользователя, но у них может быть до одного. –

+0

Я пошел с первым вариантом, который вы предложили. Создал и выполнил миграцию в моем первоначальном размещении **, плюс ** 'primary_user_id' в таблице' companies'. Я заполнил несколько пользователей и несколько компаний, затем для тестовой компании «А», я добавил внешний ключ пользователя 1. В консоли rails 'user.find (1) .company' возвращает правильный объект, но' компания .find (1).user' возвращает эту ошибку: NoMethodError: undefined method \ 'User \' for # Вы имели в виду? –

+0

Первое предложение отлично поработало, спасибо. Решение моей последующей деятельности было следующим: после того, как я получил правильные данные в базе данных, я мог бы использовать 'Company.find (1) .primary_user' –

-1

Основываясь на вашей информации, ваша модель верна.

user.rb  
belongs_to :company 

company.rb 
has_many :users 

Вы можете сделать Company.first.users видеть все пользователи первой компании.

Допустим, пользователь 1 является основным пользователем компании 1, в рельсах консоли, вы можете проверить, выполнив Company.first.users.first

Вы также можете проверить пользователя 1 Информация, выполнив: -

user1 = Company.first.users.first 
user1.username 

Когда ты создания модели пользователя, вы можете сделать: rails g model User username email phone company:belongs_to

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

create_table "companies", force: :cascade do |t| 
    t.string "companyname" 
end 

create_table "users", force: :cascade do |t| 
    t.string "username" 
    t.string "email" 
    t.string "phone" 
    t.integer "company_id" 
end 
+0

Первичный пользователь не обязательно _first_ один (особенно с неопределенным порядком сортировки) –

+0

правда, что. должен был создать основной метод пользователя в company.rb – Jefferson

0
user.rb  
belongs_to :company 

company.rb 
has_many :users 

Выше модели являются правильными. Я думаю, что для основного пользователя компании вы можете иметь еще одну модель, как primary_user_membership.rb

belongs_to :company 
    belongs_to :user 


    create_table "primary_user_memberships", force: :cascade do |t| 
    t.integer "company_id" 
    t.integer "user_id" 
    end 
Смежные вопросы