1

我有一个带有三个模型的 Rails 应用程序,称为作者、书籍和作者身份。例如,一本书通过称为作者身份的联合模型有许多作者,而作者通过称为作者身份的联合模型有许多书

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 %>

或者,如果你只想有一个迭代器,并且没有欺骗,可能是这样的(这与上面相同):

<% 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 回答