Habtm, powtarzające się wpisy

Mam dwa modele połączone za pomocą has_and_belongs_to_many :model, :uniq => true
Mam pytanie związane z przechowywaniem tego w bazie danych. W bazie danych z czasem znajdują się zduplikowane powiązania np.

+---------+----------+ | a_id | b_id | +---------+----------+ | 1 | 61 | | 1 | 126 | | 1 | 61 | | 1 | 60 | +---------+----------+
Czy to normalne, że takie powiązania mogą się powtarzać i czy to normalne (czy ja coś popsułem w implementacji u siebie), że powtarza się tylko jedno powiązanie 1-61?

Raczej nie jest to normalne.

Dobra już poradziłem sobie. Na railscasts.com jest opisane http://railscasts.com/episodes/17 w sposób obrazkowy ;-).

Witam,

Mam podobny problem, jednakże chodzi o pola select i powyższy podcast niestety nie pomaga. Posiadam jedno pole select dla kategorii nadrzędnej i trzy selecty z kategoriami podrzędnymi (zawierające wartości zależne od wartości pola nadrzędnego). Jednakże chcę uniknąć sytuacji kiedy ktoś wybierze dwie te same podrzędne kategorie. Moje “parameters” po wysłaniu formularza zawierają:

"branch_ids"=>["3", "3", "3", "3"],
Chcę wyeliminować te powtórzenia w controllerze (a najlepiej w modelu przed zapisem obiektu). Problem w tym, że próbowałem różnych sposobów i nic. Nie wiem jak się do tego dobrać. Problem wydaje się banalny, toteż liczę na waszą pomoc.

W has_many i has_and_belongs_to_many jest opcja :uniq http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

Nie mam pojęcia dlaczego wcześniej to nie działało. Teraz działa, dzięki!

OK, wracam z problemem ponownie. Przy akcji new -> create duplikaty nie są dodawane, przy edit -> update już tak. Dlaczego? Użyłem :uniq w HABTM w obu modelach.

Witam,

Użyłem opcji “:uniq => true” w obu modelach połączonych relacją HABTM (obiekt (item) -> wiele kategorii (category)). Jeżeli trzy pola select zawierają tą samą kategorię to przy dodawaniu obiektu (new/create) do tabeli categories_items zapisywana jest jedna wartość. Natomiast w tej samej sytuacji, ale przy edycji obiektu wpis jest już dublowany (przy sytuacji gdy 2-3 selecty zawierają tą samą wartość). Czy ktoś wie dlaczego tak się dzieje?

Co prawda nie używałem habtm(has_many :through jest IMO lepszym rozwiązaniem), to w API wyczytałem:

If true, duplicate associated objects will be ignored by [b]accessors[/b] and [b]query methods[/b].[/quote]

EDIT: sprawdziłem u siebie - nie zapisuje powtórzonych asocjacji.

Może masz błąd w kontrolerze/formie akcji update?
Sprawdź spod konsoli coś w stylu:

Model.first.update_attributes(:branch_ids => [1,1,1,1,2,2,2])

Nie, w bazie są powtórzone, ale Item.first.categories
zwraca jedną wartość.

Dodaj sobie unikalny klucz w bazie i będziesz wiedział kiedy dokładnie to się sypie bo poleci wyjątek. Zrób migrację

add_index :items, [:a_id, :b_id], :uniq => true

Zakładając oczywiście, że tabela nazywa się “items”.

Nałożyłem index na tabelę branches_items w ten sposób (bo powyższy nie zadziałał):

 add_index(:branches_items, [:branch_id, :item_id], :unique => true)

i otrzymałem:

Mysql::Error: Duplicate entry '2-1' for key 1: INSERT INTO `branches_items` (`branch_id`, `item_id`) VALUES (2, 1)

Błąd wystąpił w metodzie “update” w items_controller przy:

if @item.update_attributes(params[:item])

Czy ktoś wie dlaczego metoda “create” nie przepuszcza duplikatów, a “update” już tak?

Można “ręcznie” usunąć duplikaty z “params”, ale troszkę nie podoba mi się takie rozwiązanie. Jakieś pomysły?