Как получить разные значения с помощью ареля / реляционной алгебры и has_many: через - PullRequest
3 голосов
/ 26 февраля 2011

Когда я пытаюсь отобразить все фильмы, в которых снимается человек, и у них более 1 роли (режиссер, сценарист, актер) в фильме, я получаю несколько строк для этого фильма.Если я добавляю .select ('DISTINCT id') или фильмы. *, Чтобы попытаться устранить ошибки, я получаю следующую ошибку:

Mysql2 :: Ошибка: у вас есть ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'DISTINCT id FROM movies INNER JOIN movie_people ON movies .id = movie_peop' at line 1: SELECT фильмы .*, DISTINCT id FROM фильмы INNER JOIN movie_people ON movies .id = movie_people .movie_id WHERE (( movie_people`.person_id = 601619)) ЗАКАЗАТЬ ПО ЗАГОЛОВКЕ ПРЕДЕЛ 18 СМЕЩЕНИЕ 0

Я не знаю, как правильно кодировать запрос верблюда.Пожалуйста, помогите.
Спасибо.

приложение / контроллеры

class PeopleController < ApplicationController  
def show  
    @person = Person.find(params[:id])  
    @movies = @person.movies.select('DISTINCT id').
      paginate :per_page => 18, :page => params[:page],
               :order => sort_order(params[:sort]) 
end  

приложение / модели

class Person < ActiveRecord::Base  
  has_many :movie_people  
  has_many :movies, :through => :movie_people  
end  

class MoviePerson < ActiveRecord::Base  
  belongs_to :movie  
  belongs_to :person  
end  

class Movie < ActiveRecord::Base  
  has_many :movie_people  
  has_many :people, :through => :movie_people  
end  

db / schema.rb

  create_table "people", :force => true do |t|  
    t.string   "name"  
  end  

  create_table "movie_people", :force => true do |t|  
    t.integer  "movie_id"  
    t.integer  "person_id"  
    t.integer  "role"  
  end  

  create_table "movies", :force => true do |t|  
    t.string   "title"  
    t.string   "year"  
  end  

movies / show.html.erb

Title:<%= @movie.title %><br>
Year:<%= @movie.year %><br>
<% @movie.movie_people.group_by(&:role).each do |r, a| %>  
 <%= %w(Director: Writer: Cast:)[r] %>  
  <% a.each do |c| %>  
   <%= link_to c.person.name, 
       :controller => 'people', :action => 'show', :id => c.person.id %>
  <% end %><br>  
<% end %>  

Название: Фаренгейт 9/11
Год: 2004
Режиссер: Майкл Мур
Сценарист: Майкл Мур
В ролях:Майкл Мур Джордж Буш

people / show.html.erb

Name:<%= @person.name %>
<% @movies.each do |movie| %>  
<br><%= link_to movie.title, movie %> (<%= movie.year %>)  
<% end %>  

Имя: Майкл Мур
Фаренгейт 9/11 (2004)
Фаренгейт 9/11 (2004)
по Фаренгейту 9/11 (2004)

Ответы [ 3 ]

3 голосов
/ 19 сентября 2012

В Arel, uniq генерирует соответствующий select distinct SQL.Я не уверен, как добавить Arel в ассоциацию has_many, но в обычном (контроллере) коде это будет что-то вроде

@person.movies.uniq

См. http://apidock.com/rails/ActiveRecord/QueryMethods/uniq и Rails Arel, выбирающий разныестолбцы

2 голосов
/ 16 июня 2011

Это, вероятно, ошибка в Rails.

В то же время, вы можете исключить select до SELECT, например:

@person.movies.except(:select).select('DISTINCT id')
1 голос
/ 26 февраля 2011

Это решило мою проблему - rails - с помощью: select (Different) with: has_many: посредством ассоциации выдает недопустимый SQL

has_many :movies, :through => :movie_people, :select => 'distinct movies.*'
...