2015-12-15 2 views
1

У меня есть модельный билет, принадлежащий пользователю. У каждого пользователя много билетов. Таким образом, user_id является внешним ключом для каждого билета. Как я могу построить запрос, который получит мне все Билеты, упорядоченные по имени пользователя? Я пыталсяEcto: Как заказывать результаты из определенного поля во внешнем ключе

query  = from u in User, 
             preload: [:tickets] 

    query_tickets = from t in Ticket, 
             order_by: u.username, 
             preload: [users: ^query] 

    tickets = Repo.all(query_tickets) 

Но он говорит, что у модели Ticket нет пользовательской ассоциации?

 schema "tickets" do 
    field :subject,   :string 
    field :body,    :string 
    field :followup,   :boolean 
    field :closed,   :boolean 
    field :file,    :string 
    field :filepath,   :map 
    belongs_to :user,   UserController 
    has_many :ticket_message, TicketMessageController 


    timestamps 
    end 

    schema "users" do 
    field :name,     :string 
    field :username,   :string 
    field :password,   :string, virtual: true 
    field :password_hash, :string 
    field :email,    :string 
    field :client,    :string 
    field :role,     :integer 
    has_one :services, ServiceController 
    has_many :tickets, TicketController 

    timestamps 
end 

ответ

5

Вы используете preload/3 здесь, так как преднагрузки происходит после запроса (он будет получать все связанные идентификаторы в своем собственном запросе) вы не можете сортировать по user_id таким образом.

Из документов:

Repo.all from p in Post, preload: [:comments] 

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

Вы должны использовать join/5

query_tickets = from t in Ticket, 
    join: u in assoc(t, :user) 
    order_by: u.username, 

tickets = Repo.all(query_tickets) 

Если вы хотите, чтобы пользователи, которые будут установлены на user ключе билеты (например, вы получаете с предварительным натягом), то вы можете взглянуть на https://github.com/elixir-lang/ecto/issues/962

+0

Спасибо за ваш ответ, я пытался что (или что-то подобное раньше), но я получаю: '[ошибка] #PID <0.3814.0> работает MyApp.Endpoint прекращена сервера: локальный: 4000 (http) Запрос: GET/index_by_username ** (exit) было создано исключение: ** (Ecto.QueryError) web/контроллеры/ticket_controller.ex: 44: не удалось найти ассоциацию 'users' на модели MyApp.Ticket в query: ' –

+0

' users' должно быть 'user' – Gazler

+1

В моделях также возникла проблема. В ассоциациях вместо моделей были Контроллер. Он работает сейчас. Спасибо! –