a) Nazwij swoją klasę (tę joinowaną) UserCoin
b) has_many :user_coins
Wtedy powinno zadziałać.
Nie działa dlatego, że railsy próbują z nazwy asocjacji odtworzyć nazwę klasy, w której siedzi asocjowany model i spodziewają się (tak jak masz w backtrace) klasy UsersCoin, podczas gdy Ty ją nazwałeś nieco inaczej.
EDIT: A jeśli chcesz wiedzieć ogólniej, w jaki sposób railsy “tłumaczą” sobie różne nazwy (np. w routes.rb z get :users wiedzą, że powinny szukać klasy UsersController), to się pobaw tym:
Faktycznie, nie zauważyłem bałaganu w nazwach.
Jeśli chcesz iść wbrew konwencji z liczbą mnogą w nazwie modelu, to przy relacjach z tym modelem musisz dodawać opcję class_name.
Jeśli zrinejmujesz model, tak jak sugeruje Lypa, prawdopodobnie będziesz musiał dodać self.table_name=‘nazwa_twojej_tabeli’ do kodu tego modelu.
ok. przetestuje, nie jestem jeszcze aż taki oblatany w tych nazwach ale wiem dlaczego tak zrobiłem :). Zasugerowałem się tym, oczywiście popełniając 2 błędy jeden to że to jest do relacji has_and_belongs_to_many a drugi nie zrobiłem nazwu tabeli w kolejności alfabetycznej
[quote=agile web development with rails (4th edition)]Rails implements many-to-many associations using an intermediate join table.
This contains foreign key pairs linking the two target tables. Active Record
assumes that this join table’s name is the concatenation of the two target
table names in alphabetical order[/quote]
i jeszcze pytanie na koniec. Według http://guides.rubyonrails.org/association_basics.html model łączący nie ma wymagań co do nazwy patrząc na przykład poniżej. Więc jak to wszystko ma się do mojego problemu bo szczerze mówiąc się pogubiłem
No jak nie ma? Przecież wyraźnie masz model Manifest i has_many :manifests, gdzie manifests to liczba mnoga od “zunderscorowanego” Manifest. Gdybyś nazwał model Manifest jakoś inaczej, to ta asocjacja by nie działała.
Ogólnie, do rozwiązywania problemu n+1 zapytań służy w ActiveRecord metoda includes(:association_name). Nie napiszę Ci, w jaki sposób masz jej użyć, bo zwyczajnie nie rozumiem, co chcesz zrobić.
ok a możesz w takim razie napisać na swoim jakimś przykładzie jak za pomocą includes(:association_name) wyciągnąć jednocześnie dane z 2 tabeli tak aby wyświetlić je jedną pętlą?
[code=Ruby]class User < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base; end[/code]
I w kontrolerze, aby wyciągnąć użytkowników i ich posty, wystarczy wtedy napisać:
@users = User.includes(:posts)
.
Dzięki temu załadowane z bazy danych zostaną zarówno użytkownicy, jak i ich posty, do których dostęp uzyskujesz po prostu wpisujesz dla odpowiedniej instancji klasy User:
dzięki, ale to mi raczej nie pomoże, ja mam asocjacje has_many :through i potrzebuję danych ze wszystkich tabel, tzn mam usera i chce wyciągnąć rekordy z 2 pozostałych, relacja działa jak najbatdziej ale nie wiem jak dostać się jednym zapytaniu także do danych z tabeli łączącej.
[code]@userscoins = current_user.coins
@userscoins = current_user.user.coins[/code]
potrzebuję wyciągnąc to w jednym zapytaniu
[quote=patryk]dzięki, ale to mi raczej nie pomoże, ja mam asocjacje has_many :through i potrzebuję danych ze wszystkich tabel, tzn mam usera i chce wyciągnąć rekordy z 2 pozostałych, relacja działa jak najbatdziej ale nie wiem jak dostać się jednym zapytaniu także do danych z tabeli łączącej.
[code]@userscoins = current_user.coins
@userscoins = current_user.user.coins[/code]
potrzebuję wyciągnąc to w jednym zapytaniu[/quote] @user_coins = current_user.user_coins.includes(:coins) (to i tak będą 2 query)
i teraz @user_coins.first.coin nie wywoła zapytania, tylko użyje association_cache