2016-12-26 5 views
0

Мне нужно искать пользователя, но также присоединить его к другой таблице (партнеру). Вот рабочий код без объединения:Как присоединиться к Repo.find_by() в elixir

result = Repo.get_by(User, login: auth.info.email) 

В таблице пользователь имеет внешний ключ таблицы партнера, так что я подумал, чтобы попробовать это:

result = Repo.get_by(User, %{ login: auth.info.email, join: :partner }) 

Но это приводит:

field `User.join` in `where` does not exist in the schema in query: 

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

+0

'preload' будет загружать только записи, связанные с выбранным пользователем, а не всю таблицу. – Dogbert

+0

Можете ли вы привести пример использования в этом случае? Я помечаю ваш ответ как принятый. – raarts

ответ

1

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

Предварительная загрузка не загружает всю таблицу в память, а только записи, в которых конкретный внешний ключ соответствует идентификатору данной структуры.

Предполагая :partner является либо belongs_to или has_many или has_one отношения User, вы можете загрузить его, как это:

user = Repo.get_by!(User, login: auth.info.email) |> Repo.preload(:partner) 

Если вы полагаетесь на Repo.get_by вернуть nil на запись не найдена, вы» должен будет обрабатывать тот случай самостоятельно, так как Repo.preload выдаст ошибку, если вы передаете его nil в качестве первого аргумента:

user = if u = Repo.get_by(User, login: auth.info.email), do: Repo.preload(u, :partner), else: nil 

После каждого из них вы можете получить доступ к partner как user.partner.

+0

Разве это должно быть связано с соединением, или есть лучший способ? – raarts