Rails:ActiveResource和ActiveRecord类之间的HABTM关联

时间:2013-11-07 21:47:29

标签: ruby-on-rails activerecord associations activeresource

我正在尝试在我的Rails应用程序中为ActiveResource和ActiveRecord类之间的habtm关联实现自己的方法。

这是我的课程:

   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

我还连接了表项project_targets,其中包含两列project_id和target_id。

这不会在创建时将关联值记录到连接表中。

我的问题:

  1. 有没有其他方法可以做到这一点?
  2. 我在关联方法中遗漏了什么?
  3. 我真的很感激任何帮助。

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我的建议是不打击框架并使用内置方法。如果你想实现自定义访问器,那么你应该切换到有很多通道,因为它会为你提供一个模型(连接表),你可以使用它来手动设置关联。

从这里开始:http://edgeguides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

您不需要自定义访问器project_ids或项目,因为rails会神奇地完成工作。

您可以轻松完成如下任务:

some_target.projects << some_project

你甚至不必调用some_target.save,因为&lt;&lt; operator正在保存关联并将id写入连接表。

如果您有一个项目数组或一个活动记录关系(如where子句的结果),您可以以相同的方式传递它

some_target.projects << array_of_projects

要删除关联,可以使用

之类的对象调用destroy
some_target.projects.destroy a_specific_project

这不会破坏a_specific_project,但会将其取消关联。