这是我的问题:
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'?
显然,这里有自动保存选项。
答案 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 = [语言]