1

私は、著者、本、著者と呼ばれる3つのモデルを持つレールアプリを持っています。本には、オーサーシップと呼ばれる共同モデルを通じて多くの著者がいて、著者はオーサーシップと呼ばれる共同モデルを通じて多くの本を持っています。

class Author < ActiveRecord::Base
  attr_accessible :name
  has_many :authorships
  has_many :books, :through => :authorships
end

class Book < ActiveRecord::Base
  attr_accessible :name, :author_ids
  has_many :authorships
  has_many :authors, :through => :authorships
end

class Authorship < ActiveRecord::Base
  attr_accessible :book_id, :author_id
  belongs_to :book
  belongs_to :author
end

今、私の質問は、類似の著者として選択された本をどのように見つけることができますか?

たとえば、<% book = Book.first %> 次のようなもの

<% book.similar_authors.each do |book| %>
  #......
<% end %>

定義に使用するクエリの種類similar_authors

4

2 に答える 2

1

あなたの関係はすでにそれを定義しているようです。これを試して:

<% book.authors.each do |author| %>
  <% author.books.each do |book| %>
    #......
  <% end %>
<% end %>

または、イテレータを 1 つだけ使用し、複製を作成しない場合は、次のようになります (これは上記と同じです)。

<% book.authors.map { |author| author.books }.flatten.uniq.sort.each do |book|  %>
  #......
<% end %>

そして、おそらくあなたのモデルで一周するために(これは上記と同じです):

def books_from_similar_authors
  authors.map { |author| author.books }.flatten.uniq.sort
end
于 2012-11-09T05:12:03.380 に答える
0

あなたはこのようにすることができます、

例えば

あなたauthor name"xyz"

あなたのモデルで

def similar_authors(name)
  where("author_name = ?", name )
end

そしてあなたのコントローラーで

book.similar_authors('xyz') # you will get all books that have author_name is 'xyz'

最適化したい場合は、scopeそのためのを作成することもできます

于 2012-11-09T05:02:41.433 に答える