2012-07-09 2 views
1

나는 단순히 을 찾고 있습니다. 임의의 순서로 DataMapper 레코드를 반환합니다.. 여기 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 

답변

1

을 반환하고있어 어떻게 기초 on this) 또한

@movies = Movie.all.sort_by{rand} 

, 동일한 포스트 suggests

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

또는 -

@movies = Movie.all 
@movies.shuffle! 
+0

'@movies = Movie.all.shuffle!'은 (는)'@movies = Movie.all;과 어떻게 다른가요? @ movies.shuffle! '? –

+0

@padde 미묘하지만 '@movies = Movie.all.shuffle' ... 느낌표가 없습니다. '! '는 원래의 var에 있던 것을 가져 와서 덮어 쓰게된다는 것을 의미합니다. '@movies = Movie.all.shuffle' 부분에서'@ movies'에 덮어 쓸 내용이 없으므로'! '를 생략했습니다. 나는 그 방법을 물려받은 DM이 그것이 작동하지 않는다면 대안을 제시했는지 확신 할 수 없었다. – ScottJShea

+0

마지막 예제에서 두 줄에'Movie.all.shuffle! '을 쓰는 것입니다. 여전히 Movie.all의 반환 값에 대해 뮤 테이터를 호출하고 있습니다. 그래서 Movie.all.shuffle!을 호출해서는 안된다는 말의 의미는 없습니다. 그러나'Movie.all'은 복사본을 반환하기 때문에 어느 쪽이라도 괜찮습니다. 그래서 신경 쓰지 마세요. –

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 첫 번째 임의의 영화의 제목을 가져옵니다.

큰 장점은 데이터베이스에 많은 레코드가 있고 소수의 소수만을 원할 경우 모든 영화를 가져 와서 나중에 정렬 할 필요는 없지만 이처럼 :

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 
+0

당신은'저장소 (: 기본값) .adapter.select'가 SQL 문 앞에 무엇을하고 있는지 설명 할 수 있습니까? 감사. – pruett

+0

'저장소 (: 기본값)'는': default' 저장소 만 선택합니다.DataMapper에서 여러 데이터 저장소로 작업 할 수 있지만 (http://datamapper.org/docs/misc.html 참조), 이는 대부분의 응용 프로그램과 관련이 없습니다. 'adapter'는 여러분이 사용하는 데이터베이스에 따라 동적으로 해당 어댑터 (예를 들어 sqlite 어댑터)를 가져옵니다. 마지막으로'select'는 데이터베이스에 대한 쿼리를 수행합니다. –

+0

@pruett : 나는 또한 내 대답을 편집했다. 아마 도움이 될지도 모른다. –