Page 158 of 171

Acts As Random – plugin do generowania losowych ID zamiast autoincrement

O tym dlaczego ważne jest generowanie losowych ID, pisałem już w innym poście. Tutaj opiszę jak działa najważniejsza część mojego pluginu. Do pobrania jest tutaj.

Jak go dodać do klasy:

class CoolClass < ActiveRecord::Base
    acts_as_random
end

I od tego momentu generuje nam losowe wartości naszych id. W każdej klasie dziedziczącej po ActiveRecord, dodając acts_as_random, otrzymamy pseudolosowe id.

A działa to tak:

      def before_create
        range = 2147483647
        id = rand(range)
        while self.class.exists?(id) do
          id = rand(range)
        end
        self.id = id
      end

Malutko prawda? :)
Najpierw mamy deklarację zakresu INT(11) w (nawiasem mówiąc, taka sama jest w Postgresie. Wynika to z rozmiaru INTa a nie specyfikacji danego systemu bazodanowego). Następnie losujemy id z naszego zakresu, czyli od 0 do range. Sprawdzamy czy taki wpis istnieje i jeśli tak, to dopóki wpisy o ID takim jak losujemy istnieją, to musimy losować inne ID. Kiedy już mamy ID to po prostu je przydzielamy do naszego obiektu.

Proste, w miarę czytelne, niewielkie, ale swoje robi. Plusem tego pluginu jest to, że można go podpinać pod już istniejące projekty mające autoincrement. Stare elementy będą inkrementowane, ale nowe już nie.

String to URL czyli jak zamienić nazwę lub tekst na link

Dzisiaj potrzebowałem napisać sobie metodę która nazwy działów zamieni na linki. Początkowo chciałem to zrealizować w modelu Menu gdzie po prostu wywoływałbym metodę to_url która zwracałaby mi adres w formie id-jakis-tam-link. Niestety wadą takiego rozwiązania jest fakt że wtedy linki mogłyby być generowane tylko z modelu Menu.

Aby tego uniknąć napisałem malutkie rozszerzenie do klasy String, które zamienia nam tekst na odpowiednik z samymi małymi literkami, usuwa nasze "ogonki", usuwa inne niechciane w URLach znaki oraz zamienia spacje na pauzy. Jest ona bardzo prosta i niezbyt elegancka ;) ale swoje robi. Sam proces zamiany znaków polskich na ich odpowiedniki "bezogonkowe" wzorowałem na kodzie Tomasha - ascii_tic. Jednak resztę miałem już napisaną zanim zacząłem szukać rozwiązania na usunięcie ogonków.

Poniżej zamieszczam cały kod rozwiązania:

# Dodatkowe metody klasy string

class String
  # Zwraca strina bez polskich literek, z małej litery, z usuniętymi innymi
  # znakami oraze z zamienioną spacją na pauze (-)
  def to_url
    temp = self.downcase
    temp
    temp.gsub!(/[âäàãáäå�?ăąǎǟǡǻ�?ȃȧẵặ]/,'a')
    temp.gsub!(/[ëêéèẽēĕėẻȅȇẹȩęḙḛ�?ếễểḕḗệ�?]/,'e')
    temp.gsub!(/[�?iìíîĩīĭïỉ�?ịįȉȋḭɨḯ]/,'i')
    temp.gsub!(/[òóôõ�?�?ȯö�?őǒ�?�?ơǫ�?ɵøồốỗổȱȫȭ�?�?ṑṓ�?ớỡởợǭộǿ]/,'o')
    temp.gsub!(/[ùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửự]/,'u')
    temp.gsub!(/[ỳýŷỹȳ�?ÿỷẙƴỵ]/,'y')
    temp.gsub!(/[ñǹń]/,'n')
    temp.gsub!(/[çć]/,'c')
    temp.gsub!(/[ß]/,'ss')
    temp.gsub!(/[œ]/,'oe')
    temp.gsub!(/[ij]/,'ij')
    temp.gsub!(/[�?ł]/,'l')
    temp.gsub!(/[ś]/,'s')
    temp.gsub!(/[źż]/,'z')
    temp.gsub!(/[^a-zA-Z 0-9]/, "")
    temp.gsub!(/\s/,'-')
    temp.gsub!(/\-+$/,'')
    temp.gsub!(/^\-+/,'')
    temp
  end

  # to_url tylko wykonane na sobie
  def to_url!
    self.replace self.to_url
  end
end

Od teraz, mając jakikolwiek tekst, możemy na nim wywołac metodę to_url która zwróci nam jego "odpowiednik linkowy".

Copyright © 2025 Closer to Code

Theme by Anders NorenUp ↑