我的网络应用程序中有项目......
用户可以让我们在给定点说出10个或更多项目。当我输出用户的项目列表时,我希望该列表按其最后一个视图排序。用户项目列表顶部的含义是他们最近访问过的项目,底部是他们最后访问的项目。
做这样的事情最好的方法是什么?我有一个权限表来管理用户的项目权限。我想把它添加到那里,但这可能是混乱或不合适的,IDK,很想听听你的想法。
此外,在某些时候,我想让用户能够使用像Sortable这样的jQuery UI插件重新排序他们的项目列表,比如手动覆盖。有没有人为Rails实现Sortable类型的插件?
感谢!!!
答案 0 :(得分:2)
由于项目是您应用的一等公民,因此他们应该得到最好的关注 - 尝试将它们的某些方面塞进具有不同目的的权限模型可能不是一个好主意。
由于Projects可以拥有许多用户,而且用户可以拥有许多项目,因此您需要在它们之间添加多对多表模型。例如
class Project < ActiveRecord::Base
has_many :project_orders,
has_many :user_in_orders, # users who viewed the project, in order of view time
:class_name => "User", :through => :project_orders,
:order => "project_orders.last_viewed DESC"
class ProjectOrder < ActiveRecord::Base
# id
# user_id
# project_id
# position # default => 10000 # don't use field name of 'order'
# last_viewed
class User
has_many :project_orders,
has_many :orders, # The user's projects
:through => :project_orders,
:order => "project_orders.position, project_orders.last_viewed DESC"
然后,您可以通过last_viewed(默认)列出用户的订单,并通过设置位置字段进行覆盖。
由于您希望首先对具有位置设置的行进行排序,因此我们使用非常高的数字作为默认位置值。 (绝对是一个黑客)
添加以回应关于使用nil作为position的默认值的评论:
MySQL Order by子句使用升序排序将空值放在第一位,而不是最后一位。因此,如果要通过显式设置位置字段来覆盖last_viewed排序,则希望显式设置的位置字段的值小于具有默认值的行的值。所以我们使用非常高的默认值,例如10,000。 (确定想要明确订购10,000个项目的用户已经有其他问题需要处理。)
另一种方法是将默认值设置为nil或0,然后对位置字段进行降序排序。但由于目标是能够明确覆盖last_viewed订单,因此更容易将1的位置视为第一个列出,2是第二个列出的等等。
另外,请记住,只需添加project_order记录将正确排序。最近观看的内容将首先显示。 sort by position子句在默认情况下不起作用,因为用户的所有记录将具有相同的position位置。按位置和last_viewed DESC排序两个记录与仅通过last_viewed DESC排序完全相同(如果两个记录具有相同的位置值)。
回复:显示最近查看的第一个。 - 正确,你发现了一个错误。我应该包含DESC关键字。 (现已修复。)
答案 1 :(得分:0)
我不确定是否有“最好”的方法来实现这一点,一种简单的方法是在user_project_view (project_id, date, user_id, override_order)
上引入一个带有主键的(project_id, user_id)
表,并且只需更新此表用户查看项目。
然后在显示,加入并排序该表。 (您可以在[override_order,date]上订购 - 如果他们愿意,可以允许用户覆盖订单)
对于按用户订购,您可以使用act_as_list
之类的内容答案 2 :(得分:0)
你问过Rails中使用的JQuery-UI的Sortable。这是在您的应用中进行设置的绝佳资源:#147 Sortable Lists (revised)。我用它来在应用程序中实现Sortable,它只需很少的工作就可以完成。
我认为Larry K.是对的:您应该在Project模型上添加“last_viewed”属性。如果要使用sortable,还需要“position”属性。
祝你好运!