one-many-muitas condições assoc find
-
05-07-2019 - |
Pergunta
Eu tenho os seguintes modelos:
project.rb
has_many :tasks
task.rb
belongs_to :project
has_many :assignments
has_many :users, :through => :assignments
user.rb
has_many :assignments
has_many :tasks, :through => :assignments
assignment.rb
belongs_to :task
belongs_to :user
Assim, por exemplo: Project.first.title # => "Manhattan" Project.first.tasks.map (&: nome) # => [ 'Encontre cientistas', 'Encontrar Money', 'encontrar a localização'] Project.first.tasks.first.users.map (&: full_name) # => [ 'James Maxwell', 'Evariste Galois', 'Jules Verne']
Minha primeira pergunta é: Como posso encontrar nomes de todos os pessoas possivelmente com símbolo para proc em um tiro, eu tentei:
Project.first.tasks.users.full_name #=> AND FAILED
Project.first.tasks.map(&:users).full_name #=> AND FAILED
Project.first.tasks.map(&:users).map(&:full_name) #=> AND FAILED
Todas as idéias?
E eu acho que isso seguinte pergunta pode estar no mesmo parque de bola:
Como posso fazer um achado de projeto com condições que buscam o atributo 'full_name' dos usuários suas tarefas?
Project.all(:include => {:tasks => :users}, :conditions => ['tasks.users.full_name LIKE ?', query]) #this failed
Eu acho que o problema é no 'tasks.users'.
Obrigado a todos, tem uma acção de graças feliz!
Solução
Para o primeiro que você vai querer fazer algo como isto:
Project.first.tasks.map { |t| t.users.map(&:full_name) }.flatten
A razão para isso é que você quer para percorrer todas as tarefas, então todos os usuários em cada tarefa. Sem a achatar isso iria dar-lhe uma matriz de 2 dimensões.
E para o segundo seu achado deve ser:
Project.all(:include => {:tasks => :users}, :conditions => ['users.full_name LIKE ?', query])
Escrevendo users.full_name
implica para o motor de SQL que você está procurando o campo full_name
na mesa de users
.