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 ответ
Мой совет - не бороться с фреймворком и использовать встроенные методы. Если вы хотите реализовать пользовательские средства доступа, вам следует переключиться на сквозное свойство, поскольку оно даст вам модель (таблицы соединений), с которой вы можете работать, чтобы установить связь вручную.
Начните здесь: 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, но оно не будет связывать его.