Просто начните с ActiveRecord (в приложении синатра). Пытаемся связать существующие запросы с AR, но немного застряли.Тип присоединения ActiveRecord has_one Отношения
, если у меня есть HAS_ONE соотношение для пользователей и профилей (с использованием устаревших таблиц к сожалению)
class User < ActiveRecord::Base
self.table_name = "systemUsers"
self.primary_key = "user_id"
has_one :profile, class_name: 'Profile', foreign_key: 'profile_user_id'
end
class Profile < ActiveRecord::Base
self.table_name = "systemUserProfiles"
self.primary_key = "profile_id"
belongs_to :user, class_name: "User", foreign_key: 'user_id'
end
, если я хочу, чтобы запросить все пользователи с профилем, используя внутреннее соединение затем получить поле user_age из профилей используя один запрос, могу ли я это сделать?
, например (только добавил .first уменьшить код, но будет циклически всех пользователей с профилями)
user = User.all(:joins => :profile).first
user.profile.user_age
дает мне правильные данные и использует внутреннее соединение для первого запроса, но затем выпуски a second запрос, чтобы получить данные профиля
он также дает обесцененное предупреждение и предлагает использовать нагрузку, которую я пробовал, но не буду использовать внутреннее соединение.
подобный случай с
user = User.joins(:profile).first
user.profile.user_age
я получаю внутреннее соединение, но запрос для каждого пользователя строки.
Я попытался включает
user = User.includes(:profile).first
user.profile.user_age
This ленивым загружает профиль и позволит сократить число запросов в цикле, однако я думаю, что это будет тянуть пользователь без профиля слишком
Я также попытался с ссылка
user = User.includes(:profile).references(:profile).first
user.profile.user_age
Это дает мне правильные данные и снижает запросы к 1, но использует LEFT JOIN
Я, вероятно, не совсем понял это, и я пытаюсь достичь чего-то, что не подходит, я полагал, что мне может потребоваться использовать включенные и проверять нильские профили внутри цикла или использовать объединения и принимать дополнительный запрос для каждый ряд.
Думал, что я бы посмотрел, что у меня пропало что-то очевидное.
Cheers
Пат.
Вероятно, следует также отметить, что я хотел бы получить доступ к всей записи профиля (не ограничивается одной области в приведенных выше примерах) – Pat