Какой правильный способ запроса: has_many, когда условие находится в: через - PullRequest
2 голосов
/ 17 ноября 2011

у меня 3 модели

class User < ActiveRecord::Base
  has_many :profiles
  has_many :companies, :through => :profiles
end

class Company < ActiveRecord::Base
  has_many :profiles
  has_many :users, :through => :profiles
end

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

когда я хочу отправить запрос всем компаниям. Я просто набираю

u = User.find(:first)
companies = u.companies

Но когда я хочу запрашивать только компании, которые имеют

profile.is_publish == ture

Как правильно мне поступить

Первое: Я должен создать метод в User, чтобы сделать это

def published_companies
  companies.where('profiles.is_publish' => true)
end

companies = u.published_companies

Второе: Я должен создать область действия в Компании

scope :published, joins(:profiles).where('profiles.is_publish' => true)

companies = u.companies.published

Третье: Я должен создать область в Профиле

companies = u.profile.published.companies

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

1 Ответ

1 голос
/ 17 ноября 2011

Создайте область действия на Company, например:

scope :published, where(:is_publish => true)

Затем на пользователя вы звоните:

user.companies.published

Чтобы проверить правильность кода, вы можете использовать метод to_sql.

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