Mam model Station i Line. Relacja jest serialize :stations, Array. Moje pytanie jest takie - jak sprawdzić czy dana stacja należy do danej lini?
Niby powinno się to robić tak:
Line.find(:all, :conditions => [“stations LIKE ?”, “%1%2%”])
Lecz takie zapytanie porównuje nawet z 15 czy 14 i je zwraca bo jest tu jedynka.
Mam jeden sposób ale dosyć żrący:
lines = []
Line.all.each do |line|
if line.stations.include?(1)
lines << line
end
end
Jak widać stations to tablica lecz w bazie danych to jest traktowane jak zwykły string. więc szukajać stacji Line.find(:all, :conditions => [“stations LIKE ?”, “%1%2%”]) szuka również tych 14, 15 , 22, 25 itd. Dodam, że serialize sprawia to, że w railsach taki string jest traktowany jak tabica.
Sql antypattern. Utrudniasz sobie życie mówiąć “Line posiada czasami dośc dużo stacji i raczej tu nie pasuje nic innego” (argument optymalizacyjny ??) i implementując to w ten sposób zatem nic dziwnego, że później musisz kombinować… Jak chcesz sobie embedować kolekcje w obiekcie to nie ta baza danych.
IMO nie ma znaczenia, czy Line może mieć pięć, czy tysiąc pięćset stacji, o ile masz model Station (a z tego, co napisałeś, masz) powinieneś powiązać te modele relacją - wrzucenie serializowanej tablicy do jednej z tabel relacją nie jest. Tylko wtedy będziesz mógł w pełni wykorzystać wbudowane w Railsy mechanizmy.
Rozumiem, że w grę wchodzi tutaj relacja wiele-wiele, więc najlepszym rozwiązaniem będzie has_many z opcią :through + model pośredniczący (np. LineStation, z atrybutami :line_id oraz :station_id).
[code=Ruby]# line.rb
class Line < ActiveRecord::Base
has_many :line_stations
has_many :stations, :through => :line_stations
end
line_station.rb
class LineStation < ActiveRecord::Base
belongs_to :line
belongs_to :station
end
station.rb
class Station < ActiveRecrord::Base
has_many :line_station
has_many :lines, :through => :line_stations
end[/code]
Wtedy będziesz mógł sobie wyszukiwać w ten sposób:
Dzięki za pomoc. Rozwiązanie GhandaL częściowo się sprawdza. Mam teraz problem z tym szukaniem, te sposoby na szukanie wyszukują wszystkich lini z każdą stacją podaną w tablicy. Czyli potrzebuje takiego zapytania by szukało lini która posiada te stacje, a nie jedną z nich.