Mam następujące trzy modele join-relacjęRails Dołącz Wybór modelu wspólnych kolumn
class Book < ActiveRecord::Base
has_many :contributions, :dependent => :destroy
has_many :contributors, :through => :contributions
end
class Contributor < ActiveRecord::Base
has_many :contributions, :dependent => :destroy
has_many :books, :through => :contributions do
def this_is_my_contribution(book, join_attrs)
Contribution.with_scope(:create => join_attrs) {self << book}
end
end
end
class Contribution < ActiveRecord::Base
belongs_to :book
belongs_to :contributor
end
Następnie po wstawieniu rekordów do wkładu model, postanowiłem chcę zrobić kwerendę na tym modelu, aby pobrać wszystkie książki i Współpracownicy nazwiska jak kwerendy wynik jak na poniższym SQL równoważnej
SELECT Contributions.*, Contributors.name, Books.name from Contributions
INNER JOIN Contributors ON Contributors.id = Contributions.contributors_id
INNER JOIN Books ON Books.id = Contributions.books_id
Ale w IRB konsoli, gdy to pisałem,
Contribution.joins(:contributor, :book).select("contributors.name, books.name,
contributions.*")
uzyskać następujące dane wyjściowe zamiast
Contribution Load (0.8ms) SELECT contributors.name, books.name, contributions.* FROM
"contributions" INNER JOIN "contributors" ON "contributors"."id" =
"contributions"."contributor_id" INNER
JOIN "books" ON "books"."id" = "contributions"."book_id"
=> #<ActiveRecord::Relation [#<Contribution id: 1, book_id: 1, contributor_id: 1, role:
"author", created_at: "2014-04-04 00:19:15", updated_at: "2014-04-04 00:19:15">, #
<Contribution id: 2, book_id: 2, contributor_id: 2, role: "Author", created_at: "2014-
04-05 06:20:34", updated_at: "2014-04-05 06:20:34">]>
nie dostanę żadnej książki nazwę i nazwę specjalista w oparciu o sprzężenie wewnętrzne kluczy obcych.
Nie mogłem zrozumieć, w jaki sposób instrukcja SQL RAILS jest bardzo zła, kiedy tego chcę.
Co to w pełni rozumiem?
Dzięki Sat's. Przepraszam za moją spóźnioną odpowiedź. Nie mam możliwości wypróbowania powyższego kodu. Ale po przeczytaniu linku podanego powyżej, staje się dla mnie bardziej krystalicznie jasne, dlaczego konieczne jest podjęcie takich kroków. Dzięki jeszcze raz! – awongCM