0

我有一个用户模型和一个跟踪器模型。用户 has_many Trackers 和 Tracker belongs_to User。User 模型有一个名为 tracker_date 的虚拟属性,我希望能够在 Tracker 模型的 before_save 回调中使用它。回调应该为通过嵌套属性关联同时更新的所有 Tracker 记录设置 Tracker 模型中的日期。这可能吗?还是有更好的方法来做我想做的事情?

风景:

<%= 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 %>

用户.rb

has_many :trackers
accepts_nested_attributes_for :trackers
attr_accessor :tracker_date
attr_accessible :tracker_date, :trackers_attributes

追踪器.rb

belongs_to :user
attr_accessible :date
before_save :set_date

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

在此示例中,日期未在 Tracker 模型中使用来自 User 模型的虚拟属性中的值进行设置。我还尝试使用 User 模型中的虚拟属性在 Tracker 模型中进行简单验证,但这也不起作用。有没有办法让它工作,或者有没有更好的方法来避免使用虚拟属性或允许嵌套模型访问虚拟属性?

谢谢。

4

1 回答 1

0

我有这个问题。在您的示例代码中,self.user.tracker_date引用的是用户的不同实例,因此没有虚拟属性的预期值。

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

在用户中创建一个 after_save 回调。该回调将遍历所有跟踪器并设置其日期。您可以在设置日期时使用 update_column 以便跳过跟踪器验证。

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

于 2013-06-01T14:54:33.663 回答