как реализовать RoR отношение «многие ко многим»? - PullRequest
2 голосов
/ 08 июля 2011

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

Technician
- id
- name
- personal_id

Tool
- id
- internal_code
- name
- category

Техник может иметь много инструментов, и один инструмент может быть назначен многим техникам (действительно ли мне нужны отношения многие ко многим, поскольку я печатаюв этом у меня есть сомнения).Моя проблема заключается в том, что мне также необходимо отслеживать количество инструмента, которым владеет техник.Одна запись должна быть похожа на [technician_id, tool_id, количество].Я прочитал о has_many через, но я не видел пример, который подходит моей проблеме, какова должна быть структура итоговой таблицы, а также как я должен настроить модель для инструментов, которыми владеет техник?

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Похоже, это идеальное место для использования типа отношений HABTM. Вы хотите сделать следующее:

Запустите следующую миграцию:

class AddTechniciansToolsJoinTable < ActiveRecord::Migration
  def self.up
    create_table :technicians_tools, :id => false  do |t|
      t.integer :technician_id, :null => :false
      t.integer :tool_id, :null => :false
    end
    add_index :technicians_tools, [:technician_id, :tools_id], :unique => true
  end

  def self.down
    drop_table :technicians_tools
  end
end

Добавьте к своим моделям следующее:

class Technician < ActiveRecord::Base
  has_and_belongs_to_many :tools
end

class Tool < ActiveRecord::Base
  has_and_belongs_to_many :technicians
end

Это позволит вам использовать ряд методов Rails, специфичных для отношения HABTM, таких как technician.tools.size, для подсчета количества инструментов, доступных для этого конкретного техника.

Для получения дополнительной информации ознакомьтесь с руководствами Rails об отношениях HABTM здесь: http://edgeguides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference

2 голосов
/ 08 июля 2011

Кажется, что вы ищете здесь связь многих со многими. Это должно работать для вас, учитывая установленные вами требования:

class Technician < ActiveRecord::Base
  has_many :assignments
  has_many :tools, :through => :assignments
end

class Tool < ActiveRecord::Base
  has_many :assignments
  has_many :technicians, :through => :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :tool
  belongs_to :technician
end

Надеюсь, это поможет.


UPDATE

Думая о вашем комментарии о наличии поля количества в Assignments, я предполагаю, что вы хотите иметь возможность назначить множество одинаковых Tool для Technician. Например:

>> Technician.new(:name => "Bob").save
=> true
>> Tool.new(:name => "hammer").save
=> true
>> Tool.new(:name => "saw").save
=> true
>> t = Technician.first
=> #<Technician id: 1, name: "Bob", personal_id: nil, created_at: "2011-07-07 22:56:53", updated_at: "2011-07-07 22:56:53">
>> t.tools << [Tool.first, Tool.last]
=> [#<Tool id: 1, name: "hammer", internal_code: nil, category: nil, created_at: "2011-07-07 22:56:22", updated_at: "2011-07-07 22:56:22">, #<Tool id: 2, name: "saw", internal_code: nil, category: nil, created_at: "2011-07-07 22:56:30", updated_at: "2011-07-07 22:56:30">]
>> t.save
=> true
>> t.assignments
=> [#<Assignment id: 1, technician_id: 1, tool_id: 1, quantity: nil, created_at: "2011-07-07 23:01:53", updated_at: "2011-07-07 23:01:53">, #<Assignment id: 2, technician_id: 1, tool_id: 2, quantity: nil, created_at: "2011-07-07 23:02:46", updated_at: "2011-07-07 23:02:46">]
>> a = t.assignments.first
=> #<Assignment id: 1, technician_id: 1, tool_id: 1, quantity: nil, created_at: "2011-07-07 23:01:53", updated_at: "2011-07-07 23:01:53">
>> a.quantity = 5
=> 5
>> a.save
=> true
>> t.assignments.first.quantity
=> 5
>> 

Если это не так, дайте мне знать, и я могу обновить с другим подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...