0

モデルの定義:

class Article < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

class Group < ActiveRecord::Base
  has_and_belongs_to_many :articles
  has_many :domains, :inverse_of=>:group
end

class Domain < ActiveRecord::Base
  belongs_to :group, :inverse_of=>:domains
  has_many :pages, :inverse_of=>:domain
end

class Page < ActiveRecord::Base
  belongs_to :domain, :inverse_of=>:pages
  belongs_to :article, :inverse_of=>:pages
end

具体的には、に関連付けられていないすべて(を介して関連付けられている)Articleを選択したいと思います。Domainsgroups.domainsPageArticle

class Article < ActiveRecord::Base
  has_and_belongs_to_many :groups

  def avaiable_domains
    groups.domains("where not exists page with article_id=#{id}")) ##????
    #I have code mentioned at the end of this question, but I don't want use SQL, just pure active query
  end
end

純粋なActiveRecordクエリまたはArel(whereメソッドにSQLなし)で書き込むことは可能ですか?

今のところ私はこれを使用しています:

Domain.where(:group_id=>group_ids).where('NOT EXISTS(SELECT 1 FROM pages WHERE pages.domain_id=domains.id AND article_id=?)',id)
4

1 に答える 1

0
Domain.joins(:groups => :articles, :pages).where("pages.article_id <> :id AND articles.id = :id", id: article_id)

ドメインモデルで

   scope :available, ->(article_id){ joins(:groups => :articles,:pages).
          where("pages.article_id <> :id AND articles.id = :id", id: article_id)

記事モデルで

  def available_domains
    Domain.available(id)
  end
于 2012-07-18T14:00:23.203 に答える