Rails / Arel User.where (: id => <Некоторая другая таблица>.user_id)
Эй, я только возвращаюсь к рельсам и забыл много вещей, необходимых для работы с некоторыми ассоциациями.
Эта проблема:
У меня есть две таблицы, Customer
с полями id
а также user_id
а также User
с полем id
, Я хочу получить массив Users
такой, что Customer
"s user_id
это id
из User
, Я знаю, как сделать это в SQL, но забыл, как это сделать в Ariel.
редактировать
Поэтому я думаю, что мне нужно объяснить немного больше. Я беру на себя существующий проект. Между пользователями и клиентами существует взаимно-однозначное отношение, однако только некоторые пользователи имеют связанные с ними объекты клиентов, так что user.customer
вернусь nil
большую часть времени. Мне нужно отредактировать страницу, на которой в данный момент перечислены все пользователи, но теперь мне нужно перечислить только тех пользователей, у которых есть запись о клиенте
Отношения уже созданы предыдущим разработчиком:
class Customer
belongs_to :user, :class_name => "Refinery::User"
end
Refinery::User.class_eval do
has_one :customer
end
и у меня есть следующий код в моем контроллере:
def index
# i need to return an array of users, such that the only
# users in this array are the ones with a non-nil customer.
@users = Refinery::User.paginate(:page => params[:page])
end
Любая помощь будет отличной, спасибо!
2 ответа
Вы можете определить ассоциации в двух классах, belongs_to
в клиенте и has_many
в пользователя.
Затем вы сможете использовать Users.find(id).customers
и т.п.
Документация по рельсам объясняет это довольно хорошо - посмотрите на пример клиента и заказов.
обновить после вашего вопроса обновить - попробуйте
User.where("customer.id IS NOT NULL")
или же
@users = Refinery::User.where("customer.id IS NOT NULL").paginate(:page => params[:page])
Вам не нужен запрос Ариэль для этого.
Пользователь:
class User < ActiveRecord::Base
has_many :customers
end
Покупатель:
class Customer < ActiveRecord::Base
belongs_to :user
end
Код:
customer = Customer.find(1)
users = customer.users