Rails: связь HABTM между ActiveResource и классом ActiveRecord

Я пытаюсь реализовать свои собственные методы для связи habtm между ActiveResource и ActiveRecord классами в моем приложении Rails.

Вот мои занятия:

   class Project < ActiveResource::Base
   end

   class Target < ActiveRecord::Base

   has_and_belongs_to_many :projects

   def project_ids
     project_ids
   end

  def project_ids=(pids)
    project_ids = pids
  end

  def projects
    projects = []
    pids = project_ids.split(",")
    pids.each do |pid|
      projects.push(Project.find(pid))
    end
  end

  def projects=(projs)
    pids = projs.collect(&:id)
    project_ids = pids.join(",")
  end
 end

У меня также есть объединить таблицу projects_targets с двумя столбцами project_id и target_id.

Это не записывает значение ассоциации в таблицу соединений при создании.

Мои вопросы:

  1. Есть ли другой способ сделать это?
  2. Я что-то упускаю в своих методах ассоциации?

Я бы очень признателен за любую помощь.

Заранее спасибо за помощь!

1 ответ

Мой совет - не бороться с фреймворком и использовать встроенные методы. Если вы хотите реализовать пользовательские средства доступа, вам следует переключиться на сквозное свойство, поскольку оно даст вам модель (таблицы соединений), с которой вы можете работать, чтобы установить связь вручную.

Начните здесь: http://edgeguides.rubyonrails.org/association_basics.html

Вам не понадобятся специальные аксессоры project_ids или projects, потому что рельсы сделают работу волшебным образом.

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

some_target.projects << some_project

Вам даже не нужно вызывать some_target.save, потому что оператор << сохраняет ассоциацию и записывает идентификаторы в таблицу соединений.

Если у вас есть массив проектов или отношение активной записи (например, результат предложения where), вы можете передать его таким же образом

some_target.projects << array_of_projects

Чтобы удалить ассоциацию, вы можете вызвать destroy с таким объектом, как

some_target.projects.destroy a_specific_project

Это не уничтожит a_specific_project, но оно не будет связывать его.

Другие вопросы по тегам