Виртуальные атрибуты с Sinatra и Datamapper

Я конвертирую приложение 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

person Dru    schedule 10.06.2012    source источник


Ответы (1)


Я не использовал datamapper, но я думаю, что этот код предоставит вам необходимую функциональность: изменения включают новый метод класса в Link 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
person house9    schedule 10.06.2012