Wyróżnienie wybranych artykułów na stronie głównej

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ć