ActiveRecord найти запись по ссылкам HABTM - PullRequest
2 голосов
/ 02 марта 2012

У меня есть простая модель HABTM для авторов книг:

books -> books_authors -> авторы

У меня есть массив идентификаторов авторов + строка заголовка, и мне нужно найти, если уже естькнига с таким названием и имеющая именно этих авторов.

Есть идеи, как сделать это с помощью ActiveRecord в Rails 3?

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Лучшая практика для реализации habtm - это has_many: хотя

models/Book.rb
class Book <  < ActiveRecord::Base
has_many :authors
has_many :authorships, :through => author

models/Authorship.rb
class Authorship < ActiveRecord::Base
belongs_to :book
belongs_to :author

models/Author.rb
class Author < ActiveRecord::Base 
has_many :authorships
has_many :authors, :through => :authorships
0 голосов
/ 04 марта 2012

Лучшее решение, которое я нашел до сих пор, это:

Book.find(:all, :joins => :authors,
                :conditions =>
                            ["books.title = ? AND authors_books.author_id IN (?)",
                             book_title,
                             [1,2,3])

Но, к сожалению, вам нужно выполнить итерацию, чтобы удалить книги с меньшим количеством авторов (1 или 1 + 2 и т. Д.)

Теперь мне нужно найти способ заменить оператор SQL IN чем-то вроде операции "_is_exactly_this_collection_" ... Есть идеи?

0 голосов
/ 02 марта 2012

Примерно так должно работать ( не проверено! ):

books.
  joins('inner join books_authors on books.id = book_id').
  where(:title => 'search_title').
  where('author_id in (?)', author_ids.join(',')).
  group('id').
  having('count(*) = ?', author_ids.size)

Идея состоит в том, чтобы отфильтровать по авторам, которых вы ищете, а затем сравнить количество авторов, найденных в каждой книге, с количеством авторов, которых вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...