Rails многие-ко-многим: объединить через свойства класса? - PullRequest
1 голос
/ 30 марта 2011

У меня есть следующие отношения многие ко многим:

class Assignment < ActiveRecord::Base
  belongs_to :programmer
  belongs_to :project
end

class Programmer < ActiveRecord::Base
  has_many :assignments
  has_many :projects, :through => :assignments
end

class Project < ActiveRecord::Base
  has_many :assignments
  has_many :programmers, :through => :assignments
end

И в моем db: migrate у меня есть следующее:

class CreateAssignments < ActiveRecord::Migration
  def self.up
    create_table :assignments do |t|
      t.integer :programmer_id
      t.integer :project_id
      t.boolean :owner, :default => false
      t.timestamps
   end
  end

 def self.down
    drop_table :assignments
 end
end

Это означает, что я могу загрузить проект, принадлежащий программисту, выполнив следующее:

@my_programmer.projects.find params[:id]

Но если вы видите мою миграцию, у каждого назначения также есть флаг "владелец", который указывает, является ли программист владельцем этого проекта. Моя проблема в том, что этот запрос даст мне только проект, а не доступ к флагу «владелец».

Так как мне узнать, является ли программист владельцем? Я мог бы сделать еще один вызов, чтобы получить сотрудничество, но это кажется глупым, поскольку он уже выполняет JOIN на назначениях?

Есть ли способ получить свойства класса: through без необходимости выполнения определенного вызова базы данных?

1 Ответ

0 голосов
/ 30 марта 2011

Это довольно странная архитектура вашей базы данных. Но вы можете попробовать это

class Programmer < ActiveRecord::Base
  has_many :assignments
  has_many :projects, :through => :assignments

  def own_projects
    projects.where(:owner => true)
  end
end

class Project < ActiveRecord::Base
  has_many :assignments
  has_many :programmers, :through => :assignments

  def owners
    programmers.where(:owner => true)
  end

  def collaborators
    programmers.where(:owner => false)
  end
end

@my_programmer.own_projects
@my_project.owners
@my_project.owners.include? @my_programmer
@my_project.colaborators

UPD

Еще одно решение для быстрой загрузки:

class Programmer < ActiveRecord::Base
  has_many :assignments
  has_many :projects, :through => :assignments
  has_many :own_projects, :class_name => "Project", :through => :assignments, :conditions => ['assignments.owner = ?', true], :source => :project
end

class Project < ActiveRecord::Base
  has_many :assignments
  has_many :programmers, :through => :assignments
  has_many :owners, :class_name => "Programmer", :through => :assignments, :conditions => ['assignments.owner = ?', true], :source => :programmer
  has_many :collaborators, :class_name => "Programmer", :through => :assignments, :conditions => ['assignments.owner = ?', false], :source => :programmer
end

@my_programmer.projects.includes(:owners).each do |project|
  project.owner
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...