Ruby on rails 3.2 在保存回调之前在嵌套模型中使用虚拟属性

Ruby on rails 3.2 在保存回调之前在嵌套模型中使用虚拟属性,ruby-on-rails-3.2,Ruby On Rails 3.2,我有一个用户模型和一个跟踪器模型。用户有许多跟踪器,跟踪器属于用户。用户模型有一个名为tracker\u date的虚拟属性,我希望能够在tracker模型的before\u save回调中使用该属性。回调应该为通过嵌套属性关联同时更新的所有跟踪器记录设置跟踪器模型中的日期。这可能吗?还是有更好的方法来做我想做的事情 观点: <%= form_for @user, :url => {:controller => 'trackers'}, :method => 'post'

我有一个用户模型和一个跟踪器模型。用户有许多跟踪器,跟踪器属于用户。用户模型有一个名为tracker\u date的虚拟属性,我希望能够在tracker模型的before\u save回调中使用该属性。回调应该为通过嵌套属性关联同时更新的所有跟踪器记录设置跟踪器模型中的日期。这可能吗?还是有更好的方法来做我想做的事情

观点:

<%= form_for @user, :url => {:controller => 'trackers'}, :method => 'post' do |f| %>

<%= f.label :tracker_date, "Week ending" %>
<%= f.text_field :tracker_date %> <br />

    <% @user.top_items.each do |item| %>
    <%= f.fields_for :trackers, item.trackers.build do |g| %>

    <%= item.top_item_name %>   

    <%= g.text_field :value %>
    <%= g.hidden_field :position_id, :value => item.id %>  <br />
    <% end %>
    <% end %>

<%= f.submit "Submit" %>

<% end %>
Tracker.rb

belongs_to :user
attr_accessible :date
before_save :set_date

def set_date
    self.date = self.user.tracker_date
end
在本例中,不会在跟踪器模型中使用用户模型虚拟属性中的值设置日期。我还尝试使用用户模型中的虚拟属性在跟踪器模型中进行简单的验证,但也没有成功。有没有一种方法可以让它工作,或者有没有更好的方法可以避免使用虚拟属性,或者允许嵌套模型访问虚拟属性


谢谢

我有这个问题。在示例代码中,
self.user.tracker\u date
正在引用该用户的不同实例,因此不具有虚拟属性的预期值

我的解决方案不是很干净:

在用户中创建after_save回调。该回调将遍历所有跟踪器并设置其日期。您可以在设置日期时使用“更新”列,以便跳过跟踪器验证


通过在用户模型中设置跟踪器日期,您应该能够在保存任何内容之前查看虚拟属性的值。

在您的表单中,为什么控制器是“跟踪器”而不是默认的“用户”?我认为当用户单击Submit时,跟踪器记录会被保存,但用户不会重新记录。那么追踪者的日期可能还没有确定?如果您使用默认设置,并在用户
表单中使用
字段\u for:tracker
来设置跟踪器字段,会发生什么情况?好主意,谢谢,但这不是问题所在。在trackers控制器中,它只是执行@user.update_属性(params[:user])。我已经测试过一条记录将成功地从表单保存到用户模型和跟踪器模型。这只是我遇到麻烦的虚拟属性。
belongs_to :user
attr_accessible :date
before_save :set_date

def set_date
    self.date = self.user.tracker_date
end