如何编写一个范围来返回给定用户的所有“not_voted_by”电影?

时间:2018-05-12 22:22:26

标签: ruby-on-rails

在rails中我有3个模型:MovieVoteUser

class Movie
  has_many :votes
end

class User
  has_many :votes
end

class Vote
  belongs_to :movie
  belongs_to :user
end

我的模型voted_by有一个范围Movie,它会返回给定用户投票的所有电影。

class Movie
  scope :voted_by, ->(user) {
    includes(:votes).where(votes: { user: user })
  }
end

现在我想要另一个范围not_voted_by确实恰恰相反:它应该返回由给定用户投票 NOT 的所有电影。

我怎样才能做到这一点?

到目前为止我想出的是:

scope :not_voted_by, ->(user) {
  includes(:votes).where.not(votes: { user: user }).or(
    includes(:votes).where(votes: { user: nil })
  )
}

当电影由一个或零用户投票时,它可以正常工作。 但是当电影被多个用户投票时,它不起作用。

例如,如果电影M由用户AB投票。 Movie.not_voted_by(A)仍然包含M,而不应包括<?php namespace App\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="App\Repository\ProfessionnelRepository") */ class Professionnel { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=255) */ private $nomProfessionnel; /** * @ORM\Column(type="string", length=255) */ private $prenomProfessionnel; /** * @ORM\Column(type="string", length=255, nullable=true) */ private $fonctionProfessionnel; /** * @ORM\Column(type="text", nullable=true) */ private $observationsProfessionnel; /** * @ORM\Column(type="string", length=50, nullable=true) */ private $titreProfessionnel; /** * @ORM\ManyToOne(targetEntity="App\Entity\Coordonnees") */ private $coordonnees; public function getId() { return $this->id; } public function getNomProfessionnel(): ?string { return $this->nomProfessionnel; } public function setNomProfessionnel(string $NomProfessionnel): self { $this->nomProfessionnel = $NomProfessionnel; return $this; } public function getPrenomProfessionnel(): ?string { return $this->prenomProfessionnel; } public function setPrenomProfessionnel(string $PrenomProfessionnel): self { $this->prenomProfessionnel = $PrenomProfessionnel; return $this; } public function getFonctionProfessionnel(): ?string { return $this->fonctionProfessionnel; } public function setFonctionProfessionnel(?string $FonctionProfessionnel): self { $this->fonctionProfessionnel = $FonctionProfessionnel; return $this; } public function getObservationsProfessionnel(): ?string { return $this->observationsProfessionnel; } public function setObservationsProfessionnel(?string $ObservationsProfessionnel): self { $this->observationsProfessionnel = $ObservationsProfessionnel; return $this; } public function getTitreProfessionnel(): ?string { return $this->titreProfessionnel; } public function setTitreProfessionnel(?string $TitreProfessionnel): self { $this->titreProfessionnel = $TitreProfessionnel; return $this; } public function getCoordonnees(): ?Coordonnees { return $this->coordonnees; } public function setCoordonnees(?Coordonnees $coordonnees): self { $this->coordonnees = $coordonnees; return $this; } }

提前致谢!

0 个答案:

没有答案