Как вычислить процентное соотношение «равно или лучше» в базе данных mysql?

Выяснить заголовок для этого вопроса было сложно, но для меня сложнее следующее. Я надеюсь, что любой может помочь.

У меня есть простая таблица базы данных MySQL. Эта таблица заполнена записями, содержащими идентификатор и количество посетителей за неделю. У него есть записи о более чем 200 веб-сайтах за 2 года.

Подводя итог, я хочу знать две вещи:

1.) - «На 54 неделе 2009 года на веб-сайт somethingonline.com было 300 посетителей». (Легко, конечно. Я могу это сделать)

2.) - " 2 А также я спрашиваю несколько мнений у людей, которые знают лучше. Я хочу добавить WebDAV в свой ...

1 Следующее больше указывает разработчикам кода на проблему рельсов, которая может быть воспринята как недостаток.
2 А также я спрашиваю мнения людей, которые знают лучше.

Я хочу добавить WebDAV в свое приложение Rails 3 с аутентификацией Warden. Промежуточное ПО моего надзирателя внедряется через Devise.

http://github.com/chrisroberts/dav4rack
http://github.com/hassox/warden
http://github.com/plataformatec/devise

Я не могу смонтировать обработчики DAV4Rack изнутри приложения rails (маршрутов), например:

# in config/routes.rb
mount DAV4Rack::Handler.new(
  :root => Rails.root.to_s, # <= it's just an example
  :root_uri_path => '/webdav',
  :resource_class => Dav::DocumentResource # <= my custom resource, you could use FileResource from dav4rack
), :at => "/webdav"

потому что rails проверяет HTTP-команды (GET POST PUT ..), а webdav использует HTTP-расширения, такие как PROPFIND, которые не проверяют, выдавая следующее исключение:

ActionController::UnknownHttpMethod (PROPFIND, accepted HTTP methods are get, head, put, post, delete, and options)

Эта проверка выполняется в ActionDispatch:

/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/http/request.rb +56 +72
in (56) "def request_method" and (72) "def method"

Пример кода из ActionDispatch, который выполняет проверку, чтобы прояснить ситуацию:

def method
  @method ||= begin
    method = env["rack.methodoverride.original_method"] || env['REQUEST_METHOD']
    HTTP_METHOD_LOOKUP[method] || raise(ActionController::UnknownHttpMethod, "#{method}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
    method
  end
end

Теоретически, мы могли бы обезьяно исправить эту проверку, чтобы она соответствовала глаголам webdav, таким как проект railsdav, использованный для (обратите внимание, что там есть rails 2, в rails 3 нужно обезьяно исправлять action_dispatch / http / request).

Чтобы добавить обработчики DAV4Rack в приложение rails, мне нужно смонтировать обработчик вне ActionDispatch, на уровне стойки, например:

# config.ru
require ::File.expand_path('../config/environment',  __FILE__)
require 'dav4rack/interceptor'
require 'dav/document_resource'

app = Rack::Builder.new{
  map '/webdav/' do
    run DAV4Rack::Handler.new(
      :root => Rails.root.to_s,
      :root_uri_path => '/webdav',
      :resource_class => Dav::DocumentResource
    )
  end

  map '/' do
    use DAV4Rack::Interceptor, :mappings => {
      '/webdav/' => {
        :resource_class => Dav::DocumentResource
      },
    }
    run Pmp::Application
  end
}.to_app
run app

Теперь у меня есть поддержка Webdav в моем приложении. Но ему все еще нужна аутентификация, и для этого я бы хотел использовать warden.

# in document_resource.rb
def check_authentication
  puts request.env['warden'] # nil :(
end

Warden равен нулю, потому что мой DAV4Rack :: Handler установлен над промежуточным программным обеспечением сеанса и warden. Используя "промежуточное программное обеспечение rake" для проверки моего стека, я могу увидеть следующее:

> rake middleware 
use ActionDispatch::Static
use Rack::Lock
use ActiveSupport::Cache::Strategy::LocalCache
use Rack::Runtime
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::RemoteIp
use Rack::Sendfile
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::MethodOverride
use ActionDispatch::Head
use ActionDispatch::BestStandardsSupport
use Warden::Manager
run Pmp::Application.routes

Я считаю, что, обернув "Pmp :: Application.routes" обработчиком DAV (точно так же, как я сделал выше для "Pmp :: Application" в config. ru) вставит мой обработчик webdav в стек в нужное место, чтобы удовлетворить двум условиям:

  1. Быть выше кода проверки метода ActionDispatch, чтобы избежать ActionController :: UnknownHttpMethod
  2. Находиться ниже сеанса и Warden :: Manager, чтобы я мог использовать аутентификацию надзирателя.

Как это сделать? Глядя на вывод «промежуточного программного обеспечения rake», кажется очевидным переопределить метод «Pmp :: Application.routes»:

# in my app at APP_ROOT/config/application.rb
# override the routes method inherited from Rails::Application#routes
def routes
  routes_app = super
  app = Rack::Builder.new {
    map '/webdav/' do
      run DAV4Rack::Handler.new(
        :root => Rails.root.to_s,
        :root_uri_path => '/webdav',
        :resource_class => Dav::DocumentResource
      )
    end

    map '/' do
      use DAV4Rack::Interceptor, :mappings => {
        '/webdav/' => {
          :resource_class => Dav::DocumentResource
        },
      }
      run routes_app
    end
  }.to_app

  class << app; self end.class_eval do
    attr_accessor :routes_app
    def method_missing(sym, *args, &block)
      routes_app.send sym, *args, &block
    end
  end
  app.routes_app = routes_app

  app
end

Поскольку нашему новому стоечному приложению «app» будет предложено несколько методов вниз по цепочке, то старое стоечное приложение » routes_app "используется для ответа, Большой успех.

Только одна проблема: мне это не нравится. Должен быть лучший способ сделать все это обертывание, кроме метода переопределения маршрутов.

Обратите внимание, что это не работает с пассажиром. Похоже, лучший способ - это починить рельсы обезьяны.
См .: dav4rack wiki

БОЛЬШОЙ ВОПРОС:

ЕСТЬ ЛУЧШИЙ СПОСОБ ДОБАВЛЕНИЯ ПРИЛОЖЕНИЯ ДЛЯ СТОЙКИ ТОЛЬКО ВЫШЕ ПРИЛОЖЕНИЯ "Pmp :: Application # routes" С ПОМОЩЬЮ МОНТАЖА В СТОЙКЕ ИЛИ ДРУГОГО ???

БОЛЬШОЕ ЗАКЛЮЧЕНИЕ

  1. Семантика "mount" в routes.rb должна быть на уровне стойки (не rails / railtie / что-то еще), чтобы позволить таким образом обрабатывать HTTP-расширения или, по крайней мере, иметь метод для этот кейс "mount_rack"

7
задан clyfe 1 November 2010 в 18:38
поделиться