Rails 3.1 и выделение из трех таблиц

#sql #ruby-on-rails #ruby-on-rails-3 #activerecord

#sql #ruby-on-rails #ruby-on-rails-3 #activerecord

Вопрос:

У меня есть следующее, и я пытаюсь выяснить, как выбрать информацию о пользователе (sql в конце вопроса).

 # only global_id and list_id
class GlobalList < ActiveRecord::Base
    set_table_name :globals_lists
    belongs_to :list
end

# user_id
class List < ActiveRecord::Base
    has_many :global_lists
    belongs_to :user
end

# email
class User < ActiveRecord::Base
  has_many :lists
end
  

Как бы я выбрал электронные письма из списка пользователей, предполагая, что у меня есть global_id (т.Е. При условии, что global_id равен 256,

 select u.* from users u, lists l, globals_lists gl where gl.global_id=256 and gl.list_id=l.id and l.user_id=u.id)
  

Ответ №1:

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

User.includes({:lists => :global_lists}).where(['global_lists.global_id = ?', 256])

Это вернет User объекты, которые, похоже, являются тем, что вы ищете в своем запросе. Затем вы можете получить их электронную почту из их .email атрибута, в цикле или как вам это нужно.

Комментарии:

1. есть ли хороший источник / учебник для показа этих типов запросов — у меня есть тонна из них, которые мне нужно перенести из sql. thx

2. Да, вы всегда можете Object.find_by_sql(my_sql_string) выбрать, если ваш SQL очень специфичен.

3. согласен — я делал это в нескольких местах. Вероятно, потребуется провести рефакторинг при более позднем указании