2015-06-23 8 views
0

пользователя ТаблицаКак создать select cmd на рельсах активной модели?

id| name | email   | invited_by_id 
1 | jhon | [email protected] | null 
2 | sarah | [email protected] | 1 
3 | baby | [email protected] | 2 

В таблице пользователя вы увидите Саре пригласил Jhon и младенца пригласил Сару

Ожидать Результат

id| name | email   | invited_by_id | invited_by_name 
1 | jhon | [email protected] | null   | null 
2 | sarah | [email protected]| 1    | jhon 
3 | baby | [email protected] | 2    | sarah 

Как создать выберите ЦМД или лучший способ получить результат в ожидании активной модели рельсов?

+0

@ Zoker, @ A Fader Darkly ваш гид & трюк я и рабочий решить этот вопрос – PHOENIXTH

ответ

0

user.rb

def inviter_name 
    if self.invited_by_id.nil? 
    nil 
    else 
    User.find(self.invited_by_id).name 
    end 
end 

или вы можете использовать belongs_to

belongs_to :inviter, class_name: "User", foreign_key: 'invited_by_id' 

и имя приглашающего может быть получен, как показано ниже:

@user.inviter.name 
0

@Zoker правильно, вы должны добавить 'belongs_to' к определению вашей модели:

belongs_to :invited_by, class_name: "User" 

После этого, запрос может быть столь же простым, как это:

User.all.each do |user| 
    puts [user.name, user.email, user.invited_by_id.to_s, user.invited_by.name].join(", ") 
end 

Это напечатает (очень) основной список CSV результатов вам требуется. Это имеет наибольший смысл в сеансе консоли - если вы поместите этот код в контроллер, вы в конечном итоге потеряете его на выходе сервера.

Для больших списков вы получите удар производительности, используя этот поиск. Для каждой строки в базу данных будет отправлен отдельный запрос, чтобы найти пользователя «приглашен», чтобы мы могли прочитать имя.

Лучше сделать это:

User.includes(:invited_by).each do |user| 
    puts [user.name, user.email, user.invited_by_id.to_s, user.invited_by.name].join(", ") 
end 

Это говорит Rails, чтобы сделать еще один запрос, который получает все включено «invited_by» пользователей на одном дыхании. Это означает, что вместо того, чтобы (number_of_rows + 1) запросов вы сейчас делают только 2.

(код тестировался на момент написания.)

 Смежные вопросы

  • Нет связанных вопросов^_^