【问题标题】:Paginate with order defined by joined model in Rails使用 Rails 中连接模型定义的顺序进行分页
【发布时间】:2010-10-13 11:18:47
【问题描述】:

我的 Rails 应用程序(Rails 2.3.5)目前存在以下问题:

  • 我想按作者姓名,然后按书名对存储在应用程序中的书籍进行排序。

Book 和 Author 是具体模型,对应的表是 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 排序?如果这不是很容易实现的,那么什么构造可以将书籍和作者存储为单独的实体,但又可以获取具有定义顺序的分页器?

【问题讨论】:

    标签: ruby-on-rails pagination


    【解决方案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])
    

    【讨论】:

    • 看起来不错。我会试试的(当我有时间的时候)。我已经阅读了一些关于has_one 关系的内容,它表明外键指向另一个对象(这里:作者,这是错误的)。 ON ar.rubyonrails.org/classes/ActiveRecord/Associations/… 我读到belongs_to 得到了钥匙。还是关系people_ressources 中的外键?将检查明确...
    • 你需要一个AuthorBook 类(上面有belongs_to :authorbelongs_to :book)来做到这一点。我不确定您已经定义了哪些关联。
    • 我已经构建了一个全新的示例来检查解决方案,但失败了。我很确定我没有犯任何错误,我可以将书籍分配给作者,反之亦然。我得到的错误是:SQLite3::SQLException: no such column: authors.sur_name: SELECT "books".* FROM "books" ORDER BY authors.sur_name LIMIT 15 OFFSET 0 从上面使用分页调用时。我的 SQL 知识太基础,无法理解真正的原因,但我认为缺少带有属性的连接表(作者)。
    猜你喜欢
    • 2015-06-28
    • 2013-09-30
    • 2017-07-24
    • 2023-02-26
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2012-03-21
    相关资源
    最近更新 更多