2

RailsアプリをSinatraに変換しています。アプリケーションは仮想属性をサポートするActiveRecordに依存していましたが、DataMapperで同様のサポートを見つけるのに苦労しています。

Railsでは、アルゴリズムを使用してスコアを生成し、スコアに基づいてレコードを並べ替えました。このプロセスの中心は仮想属性でした。Sinatra / DMでこの機能を複製する方法を知っている人はいますか?

私はどんな回避策にもオープンです。現時点では機能にのみ関心があるため、リファクタリングは後で行うことができます。

理論的には、ソリューションは次のように機能します。

require 'sinatra'
require 'data_mapper'
require 'haml'

DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/example.db")

class Link
  include DataMapper::Resource
  property :id, Serial
  property :title, Text
  property :url, String
  property :points, Integer, :default => 0
  property :created_at, Time

  attr_accessor :score

  def calculate_score
    time_elapsed = (Time.now - self.created_at) / 3600
    self.score = (self.points-1) / (time_elapsed+2)**1.8 
  end
end

DataMapper.finalize.auto_upgrade!

get '/hot' do
    @links = Link.all :order => :score.desc 
    haml :index 
end
4

1 に答える 1

2

私は datamapper を使用していませんが、このコードは必要な機能を提供すると思いますall_sorted_desc

require 'sinatra'
require 'data_mapper'
require 'haml'

DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/example.db")

class Link
  include DataMapper::Resource
  property :id, Serial
  property :title, Text
  property :url, String
  property :points, Integer, :default => 0
  property :created_at, Time

  attr_accessor :score

  def calculate_score
    time_elapsed = (Time.now - self.created_at) / 3600
    self.score = (self.points-1) / (time_elapsed+2)**1.8 
  end

  def self.all_sorted_desc
    self.all.each { |item| item.calculate_score }.sort { |a,b| a.score <=> b.score }.reverse 
  end
end

DataMapper.finalize.auto_upgrade!

get '/hot' do
    @links = Link.all_sorted_desc 
    haml :index 
end
于 2012-06-10T21:34:08.317 に答える