有没有更好的方法从ActiveRecord连接这些表从下到上的关系?

时间:2012-02-27 07:40:49

标签: mysql ruby-on-rails ruby-on-rails-3 activerecord arel

  

作者has_many图书

     

图书has_many内容

如果我想找到一些重复的部分,例如:"兴趣" ,在所有书籍和所有作者。我也希望看到他们的book.title和author.name。

content_section = Content.where(:section  => "interest").select("book_id, section ";

books = Books.where(:id => content_section.map(&:book_id)).select("author_id, title")

authors = Author.where(:id => books.map(&:author_id)).select("name")
  • 问题1:有没有更好的方法来实现这一目标? (在绩效问题或其他一些方面)

  • 问题2:有没有办法让content_section,books和authors合并到一个表中? (在ruby端或MySQL端。)

  • 问题3:content_section.map(&:book_id)是什么意思?我想知道&:book_id
  • 的方法
例如,这个SQL(MySQL)将成为一个大表,所以我不需要将所有结果合并到ruby中。而且我更容易在视图模板中进行迭代。但是自从加入三张桌子后,它的表现非常低。

select * from authors, books, contents 

where authors.id = books.author_id and books.id = content.book_id and content.section = "interest"

任何评论都表示赞赏。感谢。

  

**更新**

引用后:enter link description hereenter link description here

我尝试添加模型:

  

班级作者

     
    

has_many:content,:through =>书

  
     

然后我在控制台中尝试了这个:

  

author.joins(:content).where(:section =>" interest")。select(" name,title,section :);

我得到一个SQL:

  

从作者内部联合书籍中选择名称,标题,部分....内部联接内容.......

  • 这样可以吗?感谢。

1 个答案:

答案 0 :(得分:1)

这可能会这样做:

class Author
  has_many :books
  has_many :contents, :through => :books

  scope :by_section, lambda { |section| joins(:contents).where('contents.section' => section) }
end

然后你可以打电话:

authors = Author.by_section("interest")

另外,你想知道content_sections.map(&:book_id)。这是content_sections.map { |content_section| section.book_id }的简写,导致一系列图书ID。