【问题标题】:Rails HABTM joining with another conditionRails HABTM 加入另一个条件
【发布时间】:2011-07-06 21:30:04
【问题描述】:

我正在尝试获取列表,我将以书籍为例。

class Book < ActiveRecord::Base
  belongs_to  :type
  has_and_belongs_to_many   :genres
end

class Genre < ActiveRecord::Base
  has_and_belongs_to_many   :books
end

所以在这个例子中,我想显示所有流派的列表,但它的第一列应该是类型。所以,如果说一个流派是“太空”,那么类型可能是“非小说”和“小说”,它会显示:

Type          Genre    
Fiction       Space
Non-fiction   Space

Genre 表只有“id”、“name”和“description”,连接表genres_books 有“genre_id”和“book_id”,Book 表有“type_id”和“id”。但是,我无法使其正常工作。

我知道我需要的 sql 代码是:

SELECT distinct genres.name, books.type_id FROM `genres` INNER JOIN genres_books ON genres.id = genres_books.genre_id INNER JOIN books ON genres_books.book_id = books.id order by genres.name

我发现我可以做到

@genre = Genre.all
@genre.each do |genre|
  @type = genre.book.find(:all, :select => 'type_id', :group => 'type_id')
  @type.each do |type|

这可以让我看到每种类型的类型并将它们打印出来,但我不能一次真正地使用它们。我认为理想的情况是,如果在 Genre.all 声明中我可以以某种方式将它们归为一组,这样我就可以将流派/类型组合保持在一起,并在未来与它们一起工作。我试图按照以下方式做一些事情:

 @genres = Genre.find(:all, :include => :books, :select => 'DISTINCT genres.name, genres.description, books.product_id', :conditions => [Genre.book_id = :books.id, Book.genres.id = :genres.id] )

但在这一点上,我在兜圈子,没有到达任何地方。我需要使用 has_many :through 吗?

【问题讨论】:

    标签: ruby-on-rails join has-and-belongs-to-many


    【解决方案1】:

    以下示例使用您在上面定义的模型。您应该使用范围将关联推回模型中(或者您可以只在模型上定义类方法)。这有助于控制您的记录获取电话,并帮助您遵守得墨忒耳法则。

    获取书籍列表,急切地加载每本书的类型和流派,无条件:

    def Book < ActiveRecord::Base
      scope :with_types_and_genres, include(:type, :genres)
    end
    
    @books = Book.with_types_and_genres  #=> [ * a bunch of book objects * ]
    

    一旦你有了它,如果我理解你的目标,你就可以做一些 Ruby 内的分组,将你的 Books 归入你需要传递给你的视图的结构中。

    @books_by_type = @books.group_by { |book| book.type }
    
    # or the same line, more concisely
    @books_by_type = @books.group_by &:type
    
    @books_by_type.each_pair do |type, book|
      puts "#{book.genre.name} by #{book.author} (#{type.name})"
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多