在多个列上使用acts_as_list

时间:2011-10-22 17:31:02

标签: ruby-on-rails acts-as-list

我有一个可能独特的情况,我需要一个模型,根据它所连接的模型,有两个不同的顺序。示例如下:

class Book
  acts_as_list :column => :genre, :scope => :genre
  acts_as_list :column => :author, :scope => :author
  belongs_to :genre
  belongs_to :author
end

所以基本上我要做的是有一个Book模型,它是两个列表的一部分,一个用于它出现的类型页面,另一个用于它出现的作者页面。

acts_as_list似乎不支持使用2个位置列,因为move_to_top等方法不允许您指定要移到顶部的列表。

有没有人对如何实现这一点有任何建议?现在我想我必须创建一个连接表,例如books_genres,其中有position列,但我真的不太热衷于此,因为这需要一大堆额外的表。< / p>

3 个答案:

答案 0 :(得分:2)

旧帖但我希望这会有所帮助。这适用于act_as_list 0.7.6至少......

在数组中添加范围并使用id作为参数...

belongs_to :website
belongs_to :page    
acts_as_list scope: [:website_id, :page_id]

答案 1 :(得分:1)

作为列表不是为多列设计的。如果你想以这种方式使用它,几乎会重写.plugin。但我认为你可以试试这个。

class Book
  belongs_to :genre
  belongs_to :author
end

class GenreBook < Book
  acts_as_list :column => :genre, :scope => :genre
end

class AuthorBook < Book
  acts_as_list :column => :author, :scope => :author
end

不确定它是否有效。理论上可行。

答案 2 :(得分:1)

尝试另一个名为ranked-model的宝石。它支持您通过指定:with_same选项提到的情况。我自己试过了。

对于您的示例,您可以执行以下操作:

class Book
    belongs_to :genre
    belongs_to :author

    ranks :within_genre,
      :with_same => :genre_id,
      :column => :genre

    ranks :within_author,
      :with_same => :author_id,
      :column => :author
end