2015-01-25 6 views
0

Я пытаюсь выбрать запись базы данных на основе значения столбца в дочерней таблице.Выбор записи родительской базы данных на основе значения дочернего столбца

В частности, у меня есть таблица, содержащая имена и контактные данные сотрудников компании, модель: Officer. Должностное лицо has_many :roles (генеральный директор, финансовый директор, президент и т. Д.); это позволяет офицеру быть президентом и генеральным директором, главным операционным директором и техническим директором, а также другими такими общими комбинациями.

Проблема: Я изо всех сил стараюсь выбрать офицера, основываясь на конкретной роли компании. (Скажем, я хочу, чтобы получить имя директора компании.)

Так я создал следующее:

class Company < ActiveRecord::Base 
    has_many :officers 
    has_many :roles, through: :officers 

    accepts_nested_attributes_for :officers 
end 

и

class Officer < ActiveRecord::Base 
    has_many :roles 

    belongs_to :company 

    accepts_nested_attributes_for :roles 
end 

и

class Role < ActiveRecord::Base 
    belongs_to :officer 
end 

Итак, я пробовал company.officer.where(roles.role_string: "Chairman of the Board") ... nope

и я пробовал company.roles.where(role_string: "Chairman of the Board").officer ... также нет

Любые указания будут оценены! Спасибо заранее.

+0

@ Нить большое спасибо за ответ. Кажется, это привело меня в порядок. Как я могу запросить значение в столбце с этим? Я попробовал «Role.includes (: officer) .where (role_string:« Председатель правления »). Fname' (попытка получить имя сотрудника), но это не сработало. – neanderslob

ответ

0

В конце концов я решил его следующим образом: (казалось наиболее эффективным)

@officer_id=company.roles.where(role_string: "President").first.officer_id 
@officer=company.officers.find(@officer_id) 

Причиной для было то, что только один сотрудник/компании разрешено иметь определенную роль, хотя офицер имеет много ролей. Вероятно, есть более элегантный способ сделать это, но на данный момент это работает.

0

Это приведет к п: м соотношение:

class Company < ActiveRecord::Base 
    has_many :officers 
    has_many :roles, through: :officers 
end 

class Role < ActiveRecord::Base 
    has_many :officers 
    has_many :companies, through: :officers 
end 

class Officer < ActiveRecord::Base 
    belongs_to :company 
    belongs_to :role 
end 
+0

Итак, это означало бы, что мне нужно добавить столбец 'role_id' для офицеров? – neanderslob

+0

Убедитесь, что миграция, которая связана с вашей моделью сотрудника, содержит t.references: компания t.references: роль Это добавит Нужные внешние ключи – Klaus

1

попробовать этот

1.

@roles = Role.includes(:officers).where(role_string: "Chairman of the Board") 

петлю и найти офицера.

@roles.each do |role| 
puts role.officer 
end 

2.

Company.includes(:roles).where('roles.role_string =?', "Chairman of the Board") 
+0

Спасибо за ответ я дал первый выстрел но не мог понять, как в конечном счете ссылаться на столбец в таблице офицеров. Я хотел бы обратиться к офицерскому столбцу 'fname', я попробовал« Role.includes (: офицеры) .where (role_string: «Председатель правления»).fname', но это не сработало. Как я могу получить значение столбца с этим? – neanderslob

+0

проверить мое редактирование .. – Nithin

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