1

我正在尝试在我的 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_id 和 target_id 的连接表 projects_targets。

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

我的问题:

  1. 有没有其他方法可以做到这一点?
  2. 我在关联方法中遗漏了什么吗?

我真的很感激任何帮助。

提前感谢您的帮助!

4

1 回答 1

1

我的建议是不要对抗框架并使用内置方法。如果你想实现自定义访问器,那么你应该切换到 has many through,因为它会给你一个模型(连接表的),你可以使用它来手动设置关联。

从这里开始: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 ,因为 << 运算符正在为您保存关联并将 id 写入连接表。

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

some_target.projects << array_of_projects

要删除关联,您可以使用像这样的对象调用destroy

some_target.projects.destroy a_specific_project

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

于 2013-11-08T00:56:48.210 回答