2012-06-10 3 views
1

Je suis en train de convertir une application Rails en Sinatra. L'application reposait sur ActiveRecord qui supporte les attributs virtuels, cependant, j'ai du mal à trouver un support similaire dans DataMapper. Dans Rails, j'ai utilisé un algorithme pour générer des scores et trier des enregistrements en fonction d'un score. Les attributs virtuels étaient au cœur de ce processus. Est-ce que quelqu'un sait comment reproduire cette fonctionnalité dans Sinatra/DM?Attributs virtuels avec Sinatra et Datamapper

Je suis ouvert à toutes les solutions de contournement. Le refactoring peut venir plus tard, car je ne m'intéresse qu'à la fonctionnalité pour le moment.

En théorie, la solution fonctionnerait quelque chose comme ceci:

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 

Répondre

2

Je ne l'ai pas utilisé DataMapper, mais je pense que ce code vous donnera les fonctionnalités nécessaires: les changements comprennent, nouvelle méthode de classe sur Lien all_sorted_desc et appel que dans la demande 'obtenir'

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 
Questions connexes