2010-10-13 27 views
0

我目前是以下問題在我的Rails應用程序(Rails的2.3.5):分頁與加盟模式在Rails的定義的順序

  • 我想通過作者的名字存儲在應用程序的書籍進行排序,然後這本書的標題。

書和作者是具體模型,相應的表是Ressources和People。該方案的相關部分(我已經剝離下來的模型位):

create_table "people", :force => true do |t| 
     t.string "sur_name" 
     t.string "pre_name" 
     ... 
     t.string "type" 
    end 

    create_table "people_ressources", :id => false, :force => true do |t| 
     t.integer "ressource_id" 
     t.integer "person_id" 
    end 

    create_table "ressources", :force => true do |t| 
     t.string "type" 
     t.string "title" 
    end 

要顯示的書籍列表中,我使用了下列分頁程序:

@books = Book.paginate(
      :order => 'title', :per_page => 15, :page => params[:page]) 

我現在的問題是:應如何構建分頁程序,以便書籍不是按標題排序,而是先由作者(==人)sur_name排序?如果這不容易達到,那麼什麼構造可以將書籍和作者存儲爲單獨的實體,但是會允許按照定義的順序得到一個分頁器?

回答

1

鑑於您有多本書,您需要決定如何確定哪些作者的姓名應該用於訂購圖書清單。

你可以關聯has_one :main_author, :class_name => 'Author'添加到無論如何定義你希望你的Book類(也許有在people_ressources主要作者字段或者,也許你只是使用可用的第一作者:

has_one :main_author, :through => :author_books, :order => 'sur_name' 

有了這樣的has_one關聯裝置你可以包括在分頁和秩序對sur_name有:。

@books = Book.paginate(:order => "#{Author.table_name}.sur_name", 
         :per_page => 15, 
         :page => params[:page]) 
+0

這看起來相當不錯,我會嘗試(當我有時間)我看過一點點關於'has_one'的關係,它告訴外鍵到另一個對象(在這裏:作者,這將是錯誤的)。 ON http://ar.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html我讀了'belongs_to'獲得了關鍵。或者是關係'people_ressources'中的外鍵?將最終檢查... – mliebelt 2010-10-13 14:02:40

+0

您需要一個'AuthorBook'類(使用'belongs_to:author'和'belongs_to:book')來做到這一點。我不確定你已經定義了哪些關聯。 – Shadwell 2010-10-13 14:52:40

+0

我已經構建了一個完整的新示例來檢查解決方案,但失敗了。我很肯定我沒有犯任何錯誤,我可以將書籍分配給作者和反正作者。我得到的錯誤是:'SQLite3 :: SQLException:沒有這樣的列:authors.sur_name:SELECT「books」。* FROM「books」ORDER BY authors.sur_name LIMIT 15 OFFSET 0'使用上面的paginate調用時。我的SQL知識太基礎,不能理解真實的原因,但它會查找具有屬性的連接表(作者)缺失。 – mliebelt 2010-10-23 15:38:33