在嵌套模型before_save回调中使用虚拟属性

时间:2013-05-24 12:50:09

标签: ruby-on-rails-3.2

我有一个用户模型和一个跟踪器模型。用户has_many跟踪器和跟踪器属于用户。 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 %>

User.rb

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

Tracker.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模型中进行简单验证,但这也不起作用。有没有办法让它工作或有更好的方法来避免使用虚拟属性或允许嵌套模型访问虚拟属性?

感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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