【问题标题】:Specifying the order of results using datamapper使用 datamapper 指定结果的顺序
【发布时间】:2012-03-27 08:31:33
【问题描述】:

我有两个关联的模型。我有一个 Artist 模型和一个 Review 模型。

class Artist
  include DataMapper::Resource

  property :id, Serial
  property :name, String

  has n, :reviews

end

class Review
  include DataMapper::Resource

  property :id, Serial
  property :rating, Integer
  property :body, String

  belongs_to :artist
end

我的目标是检索一组按与他们相关的评论的平均评分排序的艺术家。我不确定是否有任何单一的解决方案,但我目前的方法是创建一个数组,其中包含按平均评​​分排序的艺术家的 id。我如何获得这个数组的细节对于这个问题并不重要,但假设我现在有一个数组。

ids_sorted_by_rating = [4,5,23,9,2,48,17,....]

然后我检索艺术家。

artists = Artist.all(:id => ids_sorted_by_rating)

问题在于 datamapper 按 :id 排序,除非您指定其他选项。因此,在我为获得 ids_sorted_by_rating 付出了所有努力之后,我仍然得到了一个按 :id 排序的艺术家列表。

任何能够给我一个按相关评论的平均评分排序的艺术家列表的解决方案都将不胜感激。如果我不需要访问数据库一百万次即可获得该列表,则可以加分。 :)

谢谢,如果您需要更多信息,请询问,我会提供!

【问题讨论】:

    标签: ruby associations datamapper


    【解决方案1】:

    AFAIK 没有简单的方法通过 DataMapper 中的聚合进行排序(在单个查询中进行排序的方法)。您可以使用应用程序端的结果重新排序(除非您的数据集太大):

    hash = artists.index_by(&:id)
    # if you do not have index_by - use a artists.inject({}){|h,a| h.merge(a.id => a)} 
    ids_sorted_by_rating.map{|id| hash[id]}
    

    【讨论】:

    • 顺便说一句,我没有忘记你。我只是没有机会尝试一下。
    • 谢谢,我最终选择了与我写这个问题来解决的问题不同的方向,但是我在一个新的地方遇到了同样的问题并且这个工作。我认为我需要开始做的是创建自定义关联,而不是仅仅告诉 datamapper :through => Resource
    【解决方案2】:

    如果您只想显示数据(例如,您正在使用列表创建网页)并且不打算更改 Artists,您可以“作弊”并使用 SQL(假设您正在使用SQL 数据存储):

    repository(:default).adapter.select(
    'SELECT artists.*
    FROM artists JOIN reviews on artists.id = reviews.artist_id
    GROUP BY artists.id
    ORDER BY AVG(reviews.rating)')
    

    这不会返回Artist 对象,而是一个Structs 数组,每个数组都具有Artist 的所有属性,因此您可以获得所有数据,但更新它们不会有多大好处.稍后的查询可以获取“真实的”Artist(例如,用户单击艺术家的链接,您可以使用适当的id 值来查询相应的Artist 对象)。

    您还需要注意不同的 SQL 方言,并且可能需要对其进行调整以在您使用的任何 DBMS 上工作(这适用于 Sqlite,我没有尝试过其他任何方法)。

    不过,数组将按照每个艺术家的评论的平均评分排序。

    【讨论】:

    • 我想过走这条路,但我在 Sqlite 和 Postgres 之间切换,这取决于我是在本地机器上还是 heroku 上。坚持直接使用 Datamapper 很好,然后您可以在一行中说明从 Sqlite 到 Postgres 的变化。不过谢谢。如果以后成为资源消耗的严重问题,我可能不得不实现这样的东西。
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多