基本活动记录查询

时间:2012-11-09 04:41:52

标签: ruby-on-rails activerecord ruby-on-rails-3.1 ruby-on-rails-3.2

我有一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
相关问题