Использование нескольких объектов для другого поиска в Active Records / Ruby on Rails - PullRequest
0 голосов
/ 03 марта 2012

Новое в Ruby / Rails, пришедшее из c / c ++, так что я делаю свои детские шаги. Я пытаюсь найти самое элегантное решение следующей проблемы. Таблица A, помимо прочего, имеет внешний ключ к таблице B (назовем его b_id), а таблица B содержит поле имени и первичный (id).

Я хочу получить список объектов из A, основываясь на некоторых критериях, использовать b_id этого списка для доступа к таблице B и получить имена (поле имени).

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

curr_users = A.Where(condition)
curr_names = B.where(id: curr_users.b_id) # fails

Также пробовал:

curr_names = B.where(id: curr_users.all().b_id) # fails, doesn't recognize b_id

Следующее работает, но обрабатывает только одного пользователя ...

curr_names = B.where(id: curr_users.first().b_id) # ok

Я могу перебрать curr_users и создать массив внешних ключей и использовать их для доступа к B, но, похоже, для этого должен быть более элегантный способ. Что мне здесь не хватает?

Приветствие.

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Если у вас есть следующие модели:

class Employee
  belongs_to :department
end

class Department
  has_many :employees
end

Теперь вы можете отделы на основе фильтра некоторых сотрудников

# departments with employees from California
Department.include(:employees).where(:employees => {:state => "CA"}).pluck(:name)
0 голосов
/ 03 марта 2012

Для простоты, давайте возьмем пример Article и Comments вместо A и B.

Комментарий имеет внешний ключ article_id, указывающий на Article, поэтому мы можем установить отношение has_many из Article кКомментарий и отношение belongs_to от Комментария к статье, например, так:

class Article < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :article
end

Как только вы это сделаете, вы сможете сделать <article>.comments, и Rails выдаст массив всех комментариев, имеющих эту статью.иностранный ключ.Нет необходимости использовать условные выражения, если вы не пытаетесь настроить более сложный запрос (например, все комментарии, созданные до определенной даты).

Чтобы получить все заголовки комментариев (имена в вашем примере)Вы можете сделать <article>.comments.map(&:title).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...