我正在使用rails 4,当我将sql语句的结果分配给对象时,会执行更新。我怎么能避免这个?
我的模特基本上是:
class Tarifa < ActiveRecord::Base
has_many :disponibilidads
accepts_nested_attributes_for :disponibilidads
end
class Disponibilidad < ActiveRecord::Base
belongs_to :tarifa
end
我的控制器(DisponibilidadsController)。 在“步骤10”和“步骤11”之间标记是问题。
@tarifa = Tarifa.find(@tarifa_id)
disp = Disponibilidad.where(where_sentencia, where_param).order("fecha")
puts "step 10 "
@tarifa.disponibilidads = disp
puts “step 11”
如果我查看rails控制台
step 10
Disponibilidad Load (186.1ms) SELECT `disponibilidads`.* FROM `disponibilidads`
WHERE (tarifa_id = 1 AND fecha >= '2013-10-01' AND fecha <= '2013-10-31')
ORDER BY fecha
Disponibilidad Load (347.8ms) SELECT `disponibilidads`.* FROM `disponibilidads`
WHERE `disponibilidads`.`tarifa_id` = 1
(174.0ms) BEGIN
SQL (178.2ms) UPDATE `disponibilidads` SET `disponibilidads`.`tarifa_id` = NULL
WHERE `disponibilidads`.`tarifa_id` = 1 AND `disponibilidads`.`id` IN (1700,
1701,1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713,
1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726,
1727, 1728, 1729)
(172.4ms) COMMIT
step 11
如何避免此更新?我只需要将对象'disp'分配给'@ tarifa.disponibilidads'然后在视图中迭代
在视图中,我有一个simple_nested_fomr_for。 (它的确有效)
<%= simple_nested_form_for @tarifa, url: disponibilidads_path do |f| %>
来自paretn对象的一些典型隐藏字段,当我需要遍历子对象时:
<%= f.simple_fields_for :disponibilidads, :wrapper => false do |disp| %>
更新:就像评论所说,最终以这种方式解决了:
在CONTROLLER上的,使用父对象(Tarifa)和子对象(Disponibilidad)的单独对象。
@tarifa = Tarifa.find(@tarifa_id)
@disponibilidades = Disponibilidad.where(where_sentencia, where_param).order(":fecha")
在视图中,使用相同的嵌套表单,更改为:“:wrapper =&gt; false”
<%= f.simple_fields_for :disponibilidads, :wrapper => false do |disp| %>
为此:“@ disponibilidades”
<%= f.simple_fields_for :disponibilidads, @disponibilidades do |disp| %>
还有另一种方法,不将对象放入单独的父变量和子变量中,为此我们可以在模型Dispomibilidads中创建一种过滤器:
class Disponibilidad < ActiveRecord::Base
belongs_to :tarifa
scope :filtro_fecha, lambda { |inicio, fin| where("fecha >= :inicio AND fecha <= :fin", {:inicio => inicio, :fin => fin}) }
end
答案 0 :(得分:0)
disponibilidads与tarifa存在一对多的关系,因此,当您通过关系指定某些东西时,rails需要跟踪结果,这就是它正在做的事情。当然,这是设计的。
如果要做的只是在视图中显示disp
,那么只需将其存储在变量中,不要创建关系。
@disps = Disponibilidad.where(where_sentencia, where_param).order("fecha")
答案 1 :(得分:0)
根据documentation collection=objects
方法立即替换收集。如果您确实需要在不立即保存的情况下分配关联,则可以使用deferred_associations gem。但我认为最好使用另一个变量在视图中显示disponibilidads