Rails,为什么当我分配对象时,会执行更新语句?

时间:2013-12-12 19:04:54

标签: ruby-on-rails ruby-on-rails-4

我正在使用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

2 个答案:

答案 0 :(得分:0)

disponibilidads与tarifa存在一对多的关系,因此,当您通过关系指定某些东西时,rails需要跟踪结果,这就是它正在做的事情。当然,这是设计的。

如果要做的只是在视图中显示disp,那么只需将其存储在变量中,不要创建关系。

@disps = Disponibilidad.where(where_sentencia, where_param).order("fecha")

答案 1 :(得分:0)

根据documentation collection=objects方法立即替换收集。如果您确实需要在不立即保存的情况下分配关联,则可以使用deferred_associations gem。但我认为最好使用另一个变量在视图中显示disponibilidads