Populator, a tabele wiele do wielu

Chciałem skorzystać w Populatora w celu zapełnienia tabel danymi.
tabele są połączone poprzez has_and_belongs_to_many.
Tabele to Books i Categories.
Gdy próbuję czegoś takiego:

BooksCategories.populate 300 do |bk| bk.book_id = 1..100 bk.category_id = 1..25 end
to otrzymuję informację o braku modelu (co w sumie jest logiczne)

a gdy chcę to zrobić tak (na początek po jednej wartości, później można to zapętlić):

Book.populate 100 do |book| book.title = Populator.words(1..5).titleize book.description = Populator.sentences(2..10) book.year = 1913..Time.now.year book.isbn = [*('A'..'Z'),*('0'..'9')].sample(13).join book.category_ids = 1..25 end
to otrzymuję informację o braku metody (category_ids jest w attr_accessible i poprzez formularz normalnie dodaje mi rekordy do tabeli buforowej).

Nie mogę wygooglać żadnego rozwiązania, może Wy mi pomożecie :wink:

Zważ szczególnie na zagniedżoną część jednego z modeli.

nie opisałem dokładnie problemu.
prócz tabeli categories jest jeszcze tabela authors, w takiej samej relacji.
dlatego po wygenerowaniu kategorii i autorów, chciałem każdej książce przypisać po kilka kategorii i kilku autorów.

zmodyfikowałem, problem nadal występuje.
undefined method `category_id’ for #Populator::Record:0x00000809a8d660
w przykładzie relacja jest pewnie zdefiniowana przy pomocy :through

Czy masz może ten kod gdzieś na githubie?

Eh, wykorzystując “has and belongs to many” musisz mieć jakiś model spinający, u Ciebie wyraźnie ich brakuje.

[code=Ruby]class Author < ActiveRecord::Base
attr_accessible :description, :name, :book_ids

has_many :books, through: author_books
end[/code]

[code=Ruby]class Book < ActiveRecord::Base
attr_accessible :description, :isbn, :title, :year
has_many :authors, through: :author_books

tutaj dalszy kod

end[/code]

[code=Ruby]class AuthorBook < ActiveRecord::Base

kolumny book_id, author_id, bez timestamps

belongs_to :book
belongs_to :author
attr_accessible :book_id, :author_id
end[/code]
Kolejno z każdym to samo powinieneś zrobić. Generalnie bardziej zalecane tworzenie jest has_many through, niż HABTM z tego powodu, że masz większą elastyczność w definiowaniu modeli.

Więcej możesz poczytać tutaj: http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

A już tak abstrahując od tego problemu

Nie używaj unless na siłę, masz przecież if.

unless !current_user.nil? -> if current_user.nil?

To, to już w ogóle cudo :wink:

unless !(current_user.permissions != "admin") flash[:error] = "Nie masz uprawnień" redirect_to '/' end
zamień na

if current_user.permissions != "admin" flash[:error] = "Nie masz uprawnień" redirect_to '/' end
albo

redirect_to '/', flash: { error: "Nie masz uprawnień" } if current_user.permissions != "admin"

dzięki.
poprawiłem kod, zrobiłem push do repo.
Teraz SQLite wyrzuca błąd, nie wiem dlaczego:

SQLite3::SQLException: near "FROM": syntax error: SELECT  FROM "authors_books" ORDER BY  DESC

błąd tyczy się pewnie braku nazw kolumn/* po SELECT, tylko dlaczego tak to wygląda?

Puściłem Ci pull requesta. Jeszcze długa droga przed Tobą do zrozumienia, jak to działa. Nadal nie stworzyłeś modelu łączącego, a jedynie tabelę.

Przejrzyj sobie zmienione pliki (https://github.com/kejwmen/rorlib/pull/1/files) i puść “rake db:schema:load”.

Populator też działa. :wink:

cześć.
nie rozumiem, dlaczego po utworzeniu użytkownika przekierowuje do @users, zamiast to roota.
kod w gicie jest aktualny.

Litości…

if @user.save render :template => 'sessions/new' , :notice => 'Zarejestrowano!' else
Zastanów się, czym się różni render or redirect.