Mam artykuły "art 1’, “art 2”, “art 3”, “art4” itd. (model Articles). Na stronie głównej mam trzy miejsca, służące do wyróżnienia artykułów wybranych przez administratora. W panelu administracyjnym potrzebuje trzy rozwijane listy, które służą do wyboru artykułu promowanego w każdym z przeznaczonych na to miejsc na stronie głównej. Np. administrator stwierdził, że “artykul1” powinien być wyróżniony w “miejsce1”, w związku z tym loguje sie do panelu administracyjnego, wybiera z odpowiedniej listy artykuł, klika OK i artykuł wyświetla się w “miejsce1”. Za artykuły odpowiada model Articles, natomiast panelu administracyjnego pilnuje kontroler administration. Wykombinowałem sobie, że w bazie danych w tabeli articles będzie pole homepage_special_place, w którym będą zapisywane odpowiednio wartości:
1 - dla artykułu, który ma się znaleźć w “miejsce1” na stronie głównej
2 - dla artykułu, który ma się znaleźć w “miejsce2” na stronie główne
3 - dla artykułu, który ma się znaleźć w “miejsce3” na stronie głównej
NULL - dla artykułów, które nie mają być w żaden sposób wyróżnione.
Po wybraniu np. z pierwszej listy artykulu “artykul1” w polu “homepage_special_place” powinna się wpisać wartość 1, a artykuł, który poprzednio był wybrany w to miejsce powinien w tym samym polu przyjąć wartość NULL. Pytanie tylko - jak zrobić coś takiego?
Możesz to zrobić na wiele sposobów, poprez dodatkowe pole w modelu Articles i tam wpisywać co i jak ma być i gdzie, albo w osobnym modelu jakiejś ‘pozycji’ czy coś.
I w tym dodatkowym modelu znowu mozesz to zrobić na kilka sposobów, albo 3 sztywne pola :
1 - id jakies
2 - id jakies
3 - id jakies
i zmieniasz te id tylko.
Albo każdorazowo dodajesz nowy rekord (id_artice, pozycja) i wtedy masz historie tego co było na stronie głównej. Więcej możliwości to daje.
Robisz wtedy selecta z tego
poz_1 = Position.last(:conditions => [‘pozycja = 1’], order => ‘created_at’)
poz_2 = Position.last(:conditions => [‘pozycja = 2’], order => ‘created_at’)
poz_3 = Position.last(:conditions => [‘pozycja = 3’], order => ‘created_at’)
Czy dać sobie metode z paramterem bo to jest tak podobne że aż się prosi, no i możesz named_scope z tego zrobić, no jak używasz już RoR 3 to lekko musisz zmienić zapytanie
poz_1 = Position.where(:pozycja => 1).order(‘created_at’).last
coś takiego powiedźmy
Musisz to sprawdzić bo z głowy pisze
Zrobiłem to tak jak w pierwszym poście napisałem, czyli dodałem w modelu Articles dodatkowe pole, które ustala gdzie co ma być. Zostaje mi tylko problem z sytuacją kiedy np. “artykul1” jest wybrany w “miejsce1”, czyli jego pole homepage_special_place ma wartość 1. Wybieram z listy nowy artykuł w to miejsce, niech będzie “artykul2”, który po wybraniu równiez ma pole homepage_special_place z wartością 1. Jak teraz zrobić, żeby tylko 1 artykuł miał daną wartość? Czyli po wybraniu “artykul2” pole homepage_special_place artykułu, który był wybrany poprzednio powinno przyjąć wartość NULL.
Musisz ręcznie wyzerować ten artykuł, który ma daną wartość.
Article.find_by_homepage_special_place(1).update_attribute :homepage_special_place, nil
@article = Article.find(params[:id])
@article.update_attribute :homepage_special_place, 1
No i wybrałeś najgorszą z możliwości ale spoko, wszystko da się zrobić.
Przed zmiana musisz dać find i wyczyścić to pole, czyli
def mark(poz, nowy_id)
a = Article.find(:conditions => 'poz = ?',poz)
a.poz = nil
a.save
a = Article.find(nowy_id)
a.poz = poz
a.save
end
Koncepcyjnie coś takiego
No spóźniłem się ;] Ale chyba już kumasz jak to ma wyglądać