3

人が出演しているすべての映画を表示しようとすると、映画の中で複数の役割(監督、作家、俳優)がいる場合、その映画には複数の行が表示されます。.select('DISTINCT id')またはmovies。*を追加して重複を排除しようとすると、次のエラーが発生します。

Mysql2 :: Error:SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、使用する正しい構文を確認してください。'DISTINCT id FROM moviesINNER JOIN movie_peopleON movies.id = movie_peop' at line 1: SELECTmovies .*, DISTINCT id FROMmovies INNER JOINmovie_people ONmovies .id =movie_people .movie_id WHERE ((movie_people`.person_id = 601619))ORDER BY title LIMIT 18 OFFSET 0

arelリクエストを正しくコーディングする方法がわかりません。助けてください。
ありがとうございました。

アプリ/コントローラー

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 %>  

タイトル:華氏911
年:2004年
監督:マイケル・ムーア
脚本:マイケル・ムーア
キャスト:マイケル・ムーアジョージ・W・ブッシュ

people / show.html.erb

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

名前:Michael Moore
Fahrenheit 9/11(2004)
Fahrenheit 9/11(2004)
Fahrenheit 9/11(2004)

4

2 に答える 2

3

Arel ではuniq、適切なselect distinctSQL を生成します。Arel を has_many 関連付けに追加する方法がわかりませんが、通常の (コントローラー) コードでは次のようになります。

@person.movies.uniq

http://apidock.com/rails/ActiveRecord/QueryMethods/uniqおよびRails Arel が個別の列を選択するのを参照してください

于 2012-09-18T21:27:22.840 に答える
2

これはおそらく Rails のバグです。

それまでの間、次のように、個別の選択の前に選択を除外できます。

@person.movies.except(:select).select('DISTINCT id')
于 2011-06-15T22:40:04.330 に答える