13

has_and_belongs_to_many 関係を持つ Page モデルと Paragraph モデルがあります。paragraph_id を指定して、一致するすべてのページを取得したいと思います。例えば:

pages = Paragraph.find(paragraph_id).pages.all

ただし、これには 2 つのクエリが必要です。1 つのクエリで実行できます。

SELECT "pages".* FROM "pages" 
INNER JOIN "pages_paragraphs" ON "pages_paragraphs"."page_id" = "pages"."id" 
WHERE "pages_paragraphs"."paragraph_id" = 123

しかし、これはなしで行うことができますか

  • find_by_sql の使用
  • page_paragraphs テーブルを変更せずに (ID の追加など)。

アップデート:

私のページモデルは次のようになります。

class Page < ActiveRecord::Base
  has_and_belongs_to_many :paragraphs, uniq: true
end
4

3 に答える 3

21

has_many :through 関係を使用すると、次のように使用できます。

pages = Page.joins(:pages_paragraphs).where(:pages_paragraphs => {:paragraph_id => 1})

ここで、結合されたテーブルでの条件の指定をご覧ください: http://guides.rubyonrails.org/active_record_querying.html

ページと段落を一緒にしたい場合:

pages = Page.joins(:pages_paragraphs => :paragraph).includes(:pages_paragraphs => :paragraph).where(:pages_paragraphs => {:paragraph_id => 1})

has_and_belongs_to_many の場合:

pages = Page.joins("join pages_paragraphs on pages.id = pages_paragraphs.page_id").where(["pages_paragraphs.paragraph_id = ?", paragraph_id])
于 2012-11-29T14:34:35.863 に答える
1

これに使用できますincludes

pages = Paragraph.includes(:pages).find(paragraph_id).pages

于 2012-11-29T11:57:20.823 に答える