【问题标题】:basic active record query基本活动记录查询
【发布时间】:2012-11-09 04:41:52
【问题描述】:

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

现在我的问题是,我怎样才能找到作为相似作者的任何选定的书籍

例如,&lt;% book = Book.first %&gt;

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

我将使用什么样的查询来定义similar_authors

【问题讨论】:

  • 是什么让一位作者与另一位作者相似?
  • 某种意义上的相似作者?
  • 作者 ID。这意味着查找具有相似 author_id 的书籍
  • 显示与所选图书具有相同 author_id 的图书

标签: ruby-on-rails activerecord ruby-on-rails-3.1 ruby-on-rails-3.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

【讨论】:

  • 在这种情况下,一本书会显示两次。这意味着如果四位作者拥有同一本书,它将被显示四次。
  • 是的,已对此进行了更新(空中代码,可能需要稍微调整)
  • 谢谢@Brad Werth。这看起来很棒。
  • 我会告诫不要在 Rails 中完成所有工作,因为它会使用更多资源。你最好制作一个数据库查询(通过范围或方法)
  • 已更新以反映这种担忧,这是有效的。我认为语言理解比过早优化更重要。听起来这个网站需要一些好的缓存,无论如何,如果它有任何腿......
【解决方案2】:

你可以这样做,

例如

假设你的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

【讨论】:

  • 这仅适用于一个作者姓名。作者的名字是什么是像%w("xyz abc ddd ccc eee")这样的数组我该怎么做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2016-03-10
  • 2013-02-01
  • 2013-04-23
  • 2016-11-10
相关资源
最近更新 更多