Jak najefektywniej przenieść find do modelu?

Witam,
W aplikacji mam dwa modele:

class Sklep < ActiveRecord::Base has_many :urzadzenia end
oraz:

class Urzadzenie < ActiveRecord::Base
  belongs_to :sklep
end

Kontroler:

class UrzadzeniaController < ApplicationController
def show
    @urzadzenie = Urzadzenie.find(params[:id])
    @sklep = Sklep.find_by_id(@urzadzenie.sklep_id, :select => 'nazwa_sklepu')
end

Widok:

<%=h @sklepy.nazwa_sklepu %>

Chciałbym przenieść find do modelu, żeby odchudzić kontroler.
Jak najefektywniej to zrobić?

Ja bym to zrobił za pomocą named scope

named_scope :find_all_by_urzadzenie, lambda {|urzadzenie_id|{ :include => :urzadzenia, :conditions => {:urzadzenia => {:id => urzadzenie_id}} }}

Może w ogóle wyrzucić szukanie sklepu? i w widoku zrobić tylko

<%=h @urzadzenie.sklep.nazwa_sklepu %>

Named_scope to trochę overkill, skoro Urządzenie belongs_to :sklep - znaczy zawsze będzie tylko jeden.

Wyrzucając find’a i korzystając z samego widoku tak jak zaproponował Squil do bazy danych generowane jest zapytanie

SELECT * FROM "sklepy" WHERE ("sklepy"."id" = 2)

Jest możliwość dodania opcji select ‘nazwa_sklepu’ w <%=h %> , żeby uniknąć wyciągania całego wiersza tabeli?

Czemu chcesz uniknąć wyciągania całego wiersza?

W celu optymalizacji tego zapytania. Wyciągając tylko konkretną komórkę powinno być szybciej IMHO.

Będzie bardzo niewiele szybciej, a Twój kod będzie niepotrzebnie skomplikowany.
http://en.wikipedia.org/wiki/Optimization_(computer_science)#When_to_optimize - premature optimization is the root of all evil.

Dzięki piękne za pomoc :slight_smile: Wychodziło mi około 2 ms różnicy :stuck_out_tongue: Zostaje przy czystym kodzie :wink:

Ok. Wykonam porządny benchmark po napisaniu całego kodu :slight_smile:

Pisałeś wcześniej kodeki, że aż tak Cię to przejmuje ? :stuck_out_tongue:

Rada na początek: nie używaj języka polskiego do nazywania klas, zmiennych itd.

Trzy sugestie:

  • bezwzględnie trzeba używać w kodzie angielskich indentyfikatorów (z wielu powodów)
  • słusznie pozbyłeś się tej “optymalizacji”
  • nie powiela się nazwy klasy w nazwie atrybutu, czyli Sklep#nazwa_sklepu => Market#name

Dzięki za rady. Na początku używałem nazw angielkich, jednak przymierzam się do napisania aplikacji, w której konieczne
będzie zastosowanie nazw polskich w adresie URL. Zastosowałem więc polskie nazwy z dodaniem do pliku
inflections.rb: inflect.irregular dla każdego wyrazu, aby rozwiązać problem pluralize. Sugerowałem się przykładem
infakt.pl, gdzie widziałem polskie nazwy w adresie URL.

Jest jakaś lepsza metoda na polskie nazwy w URL, stosując w nazwach klas, zmiennych, tabel, baz danych etc., nazwy
angielskie? Może routing?

http://guides.rubyonrails.org/routing.html#translated-paths

Z tego, co pamiętam, to było do tego jeszcze kilka innych gemów ułatwiających robotę. Nie wiem, na ile wystarcza zapewniane przez RoR rozwiązanie, bo nigdy go nie używałem.

[quote=mlrk]Jest jakaś lepsza metoda na polskie nazwy w URL, stosując w nazwach klas, zmiennych, tabel, baz danych etc., nazwy
angielskie? Może routing?[/quote]
Dla URL’i masz opcję :as przy mapowaniu zasobów w routes.rb.
Dla całej reszty masz I18n.

Tu jest przykład porządkowania podobnego kontrolera:
http://railscasts.com/episodes/3-find-through-association
http://railscasts.com/episodes/4-move-find-into-model