在rails中我有3个模型:Movie
,Vote
和User
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
由用户A
和B
投票。 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;
}
}
。
提前致谢!