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

そして、これが私がレコードを返す方法です(シナトラ)

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、最初のランダムな映画のタイトルを取得します。

大きな利点は、データベースに多数のレコードがあり、少数のランダムなレコードのみが必要なMovie場合、すべてのムービーをフェッチして後で並べ替える必要はありませんが、次のような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

私はあなたがこれを行うことができると信じています(これに基づい):

@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 に答える