Ruby-newbie Active Record запрос / модель ассоциации - PullRequest
1 голос
/ 19 марта 2012

Вот примерно то, что у меня есть:

У меня много компаний, у которых много ролей пользователей:

class Company < ActiveRecord::Base
  has_many :roles, :dependent => :destroy
  has_many :users, :through => :roles
end

и много пользователей, которые могут иметь много компаний через роли:

class User < ActiveRecord::Base
  has_many :roles, :dependent => :destroy
  has_many :comapnies, :through => :roles
end

и множество ролей, которые связывают их вместе:

class Role < ActiveRecord::Base
  belongs_to :user
  belongs_to :company
end

Идея в том, что пользователь может войти в систему с помощью общего имени пользователя электронной почты, а затем назначить привилегии каждой компании. Роль имеет ключи user_id и company_id вместе со столбцом привилегий user_role (то есть гость, пользователь, администратор и т. Д.).

Вот здесь меня и ругает новичок. Когда мой пользователь входит в систему, я хочу узнать, на какие компании у них есть привилегии, и переключить их на лету с помощью выпадающего меню. Таким образом, они входят в систему и активны в «Компания А», а затем они могут переключиться на «Компания Б». Когда они переключаются, company_id сохраняется в переменной сеанса (у меня уже есть user_id, сохраненный в работающей системе аутентификации).

Как лучше всего это сделать? У меня есть user_id, и я хочу получить список company_id, company_name, 'user_role' и т. Д., А затем использовать его для создания всплывающего списка.

Я играл с консолью, пытаясь Role.Company.etc.etc, но не могу понять это. Когда я делал это в PHP / MySQL, раньше это был сложный запрос на соединение. Я уверен, что в Rails легче, я, кажется, не могу понять это. Любая помощь будет оценена.

Спасибо

Dan

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

Спасибо всем за отзывы.Это заставило меня посмотреть на включает и снова присоединяется.В итоге я посмотрел на http://railscasts.com/episodes/181-include-vs-joins и документы Rails API и соединил это:

Role.includes(:company).where(:user_id => session[:user_id])

Затем я перебираю @role и могу вытащить role.role_name иrole.company.name и т. д. Запуск запроса с помощью User.find (session [: user_id]) усложнил его.

0 голосов
/ 19 марта 2012

Вы можете получить доступ ко всем компаниям, к которым у пользователя есть доступ (для любой роли), через current_user.companies.uniq. Часть uniq просто гарантирует, что в списке нет повторяющихся компаний (в случае, если у пользователя более одной роли в одной компании).

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