Rails has_and_belongs_to_many总是插入数据库

时间:2011-12-14 11:22:58

标签: ruby-on-rails database activerecord has-and-belongs-to-many

这是我的问题:

class Facility < ActiveRecord::Base
...
has_and_belongs_to_many :languages, :autosave => false, :join_table => 'facilities_languages'
... 
end

当我做这样的事情时:

facility = Facility.find(1)
language = Language.find(1)
facility.languages << language

Rails总是执行SQL请求:

"INSERT INTO `facilities_languages` (`language_id`,`facility_id`) VALUES (1, 1)"

有没有办法避免数据库请求,除非我调用'facility.save'?

显然,这里有自动保存选项。

3 个答案:

答案 0 :(得分:1)

如果您使用铲子操作员&lt;&lt; Rails自动保存关联的对象。

从文档中 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

  

collection&lt;&lt;(object,...)

     

通过添加一个或多个对象到集合   在连接表中创建关联(collection.push和   collection.concat是此方法的别名)。请注意这一点   操作立即触发更新sql而无需等待保存或   更新父对象的调用。

答案 1 :(得分:1)

您的问题是您使用的has_and_belongs_to_many不是基于Model,因此您无法将其作为对象访问。您可以创建一个正在执行关联的Model,然后您可以创建此关联模型的新对象。 e.g:

rails g scaffold JoinClass faculty_id:integer language_id:integer

在模型中

class JoinClass < ActiveRecord::Base
     belongs_to :faculty
     belongs_to :language
end

在其他模特中:

class Faculty < ActiveRecord::Base
     has_many :join_classes
     has_many :languages, :though => :join_classes
end

语言

class Language < ActiveRecord::Base
     has_many :join_classes
     has_many :faculties, :through => :join_classes
end

然后,您可以通过创建未自动保存的关联对象来添加关联。例如,您有String个包含ID的ids,其中包含language_ids中应该关联的语言对象的ID FacultyController

language_ids.split(",").each do |language_id|
    JoinClass.create(:faculty_id => @faculty.id, :language_id => language_id)
end

原因是这个代码应该在教师保存后进行调节和定位。

答案 2 :(得分:0)

facility.languages = [语言]