1

我只是想以随机顺序返回 DataMapper 记录

这是我的模型(使用带有 sqlite3 数据库的 DataMapper):

class Movie
  include DataMapper::Resource
  DataMapper::Property::String.length(255)

  property :id, Serial
  property :title, String
  property :img, String
  property :description, String
  property :year, String
  property :created_at, DateTime

  has n, :votes 
  belongs_to :user
end

这就是我返回记录的方式(Sinatra)

get '/' do
  @movies = Movie.all # <-- What should this look like?
  haml :home
end
4

2 回答 2

2

您也可以在 SQL 中执行此操作,例如:

class Movie
  # tons of other stuff here...

  def self.random
    repository(:default).adapter.select <<-SQL
      SELECT * FROM movies ORDER BY RANDOM()
    SQL
  end
end

然后你可以做

get '/' do
  @movies = Movie.random
  haml :home
end

乳清你使用 MySQL,你需要替换RANDOM()RAND(). 请注意,返回的对象Movie#random不是Movie对象并且是只读的,但是您可以像读取Movie对象一样读取属性,例如Movie.random.first.title获取第一部随机电影的标题。

最大的优势是,如果您的数据库中有许多记录并且只想要少数随机Movies,则不必获取所有 Movies 并在之后对其进行排序,但您可以使用如下 SQL 查询:

SELECT * FROM movies ORDER BY RANDOM() LIMIT 10

或者你可以将你的方法扩展为这样的:

class Movie
  # tons of other stuff here...

  def self.random(opts={})
    query = "SELECT * FROM movies ORDER BY RANDOM()"
    query << " LIMIT #{opts[:limit]}" unless opts[:limit].nil?
    repository(:default).adapter.select(query)
  end
end

它允许编写这样的查询:

Movie.random              # get all movies sorted randomly
Movie.random(:limit => 5) # get five random movies
于 2012-07-10T07:21:52.203 回答
1

我相信你可以做到这一点(基于this):

@movies = Movie.all.sort_by{rand}

此外,同一篇文章建议 Array#shuffle!使用数组并将其随机排列,因此可能是这样的:

@movies = Movie.all.shuffle #no ! since you are not replacing the Array; not sure if DM supports it

- 或者 -

@movies = Movie.all
@movies.shuffle!
于 2012-07-10T06:10:01.523 回答