0

すべての記事の在庫を定義しようとしていますが、パラメーターで送信された記事を除外したいと考えています。

関係は次のようになります。

  Article
    has_many :tags, through: :articletags
  ArticleTags
    belongs_to :article
    belongs_to :tags
  Tags
    has_many :article, through: articletags

私のモデルでタグのないものを定義する方法は次のとおりです。

def self.by_not_tags(tag)
  joins(:tags).where('tags.title != ?', tag)
end

これが私の見解でそれを呼び出す方法です:

<%= link_to (tag.title), articles_path(:scope => tag.title) %>

これが私のコントローラーです:

 def custom
    if params[:scope].nil?
      @articles = Article.all(:order => 'created_at DESC')
    else
      @articles = Article.by_tags(params[:scope])
      @articles2 = Article.by_not_tags(params[:scope])
    end
  end

目標は、最初にタグ付きのすべての記事を表示し、次にそのタグのない他の記事を表示することです。そのため、重複はありません。

私の問題は結合にありますが、タグのない記事を見つける方法がわかりません。例外が機能する可能性がありますが、どのようなクエリが機能するかはわかりません。

4

1 に答える 1

2

ArticleTag モデルが article_id と tag_id の両方の存在を検証する必要があると仮定すると、

Article.where('article_tag_id is null')

上記の検証が述べられていると仮定しない場合、

Article.where('not exists (select 1 from article_tags where article_id = articles.id)')
于 2012-09-20T05:28:07.203 に答える