2016-03-10 3 views
0

У меня есть эта схема:Rails 4 - как получить все «принадлежит_to» для объекта?

class Car < ActiveRecord::Base 
    belongs_to :owner 
end 
class Owner < ActiveRecord::Base 
    has_many :cars 
end 

Принести все автомобили, которые были добавлены между определенными датами, например:

@cars = Car.where("... from-to condition ...") 

То, что я пытаюсь получить: уникальный список всех владельцев от @cars , наилучшим образом, как owners.email + owners.id. Я пытался сделать

puts @cars.owner.pluck(:id, :email).inspect 

Но это приводит к следующей ошибке:

undefined method `owner' for #<ActiveRecord::Relation::... 

Как получить список всех владельцев выбранных автомобилей?

спасибо.

ответ

0
Car.where("... from-to condition ...").joins(:owner).distinct.pluck('owners.id', 'owners.email') 

EDIT: Исправлена ​​ошибка.

+0

Не могла бы эта попытка сорвать 'cars.id' и' cars.email' не 'владельцы. *'. – max

+0

@max Вы правы. Исправлена. Благодаря! – user4092233

1

Попробуйте это:

puts @cars.joins(:owner).pluck("owner.id, owner.email") 
0

Вы также должны использовать distinct, чтобы избежать пользователей, которые имеют несколько автомобилей, которые будут перечислены несколько раз:

Car.where(condition: 'something'). 
    joins(:owner). 
    pluck('DISTINCT owners.id, owners.email') 
2

Вы поедете на это с изнаночной стороны. Вы пытаетесь найти Owners, поэтому начать там:

Owner

Теперь вы добавляете соединения, так как вы пытаетесь найти owners чьи cars отвечают определенным критериям:

Owner.joins(:car)

затем добавьте свой адрес:

Owner.joins(:car).where(cars: {>your conditions<})

затем добавить distinct, так как в некоторых случаях вы можете иметь владельца, который имеет несколько автомобилей, которые соответствуют:

Owner.joins(:car).where(cars: {>your conditions<}).distinct

И затем, если вы просто хотите Ид/электронную почту, вы можете срывать:

Owner.joins(:car).where(cars: {>your conditions<}).distinct.pluck("owner.id, owner.email")