#ruby-on-rails #ruby #model #acts-as-taggable-on
#ruby-on-rails #ruby #Модель #действует как тегируемый
Вопрос:
Будет ли этот метод обновлять временную метку updated_at для каждого тега из массива Acts_As_Taggable_On tag_list?
def update_tag_timestamp
self.tag_list.each do |tag|
tag.update_attribute(:updated_at, Time.current)
end
end
Я использую Ruby 1.9.2, Rails 3.0.7 и драгоценный камень Acts_As_Taggable_On.
post.rb:
class Post < ActiveRecord::Base
after_create :update_tag_timestamp, :destroy_old_posts
acts_as_taggable
validates :name, :allow_blank => true,
:length => { :maximum => 64 }
validates :title, :presence => true,
:length => { :maximum => 64 }
validates :content, :presence => true,
:length => { :maximum => 1024 }
validates :tag_list, :presence => true,
:length => { :maximum => 24 }
has_many :comments, :dependent => :destroy
#belongs_to :tag#, :dependent => :destroy
attr_accessible :name, :title, :content, :tag_list
# Finds last three comments for a message.
def firstcomments
comments.find(:all, :limit => 3, :order => 'updated_at DESC').reverse
end
protected
# Updates the timestamps of the Parent Post's tag_list array
def update_tag_timestamp
self.tag_list.each do |tag|
tag.update_attribute(:updated_at, Time.current)
end
end
def destroy_old_posts
self.tag_list.each do |tag|
posts = Post.tagged_with(tag, :order => 'updated_at DESC')
posts[100..-1].each {|p| p.destroy } if posts.size >= 100
end
end
end
комментарий.rb: (упрощенный с помощью touch
)
class Comment < ActiveRecord::Base
validates :commenter, :allow_blank => true,
:length => { :maximum => 64 }
validates :body, :presence => true,
:length => { :maximum => 1024 }
after_create :destroy_old_comments
belongs_to :post, :touch => true
attr_accessible :commenter, :body
protected
# Destroys oldest comment after limit is reached
def destroy_old_comments
comments = post.comments(:order => 'updated_at ASC').reverse
comments[100..-1].each {|c| c.destroy } if comments.size >= 100
end
end
tag.rb: (это не работает, я могу создать столько тегов, сколько захочу. Ограничение игнорируется)
class Tag < ActiveRecord::Base
after_create :destroy_old_tags
has_many :posts, :dependent => :destroy
protected
def destroy_old_tags
tags = Tag.all(:order => 'updated_at DESC')
tags[100..-1].each {|t| t.destroy } if tags.size >= 100
end
end
Комментарии:
1.
taggings
таблица изacts_as_taggable_on
вообще не содержитupdated_at
атрибута.2. Я добавил столбцы updated_at и created_at в свою модель тегов. Я хочу иметь возможность сортировать теги по времени их последнего обновления в моей модели Post.
Ответ №1:
используйте tag.touch(:updated_at)
вместо update_attribute
touch
существует ли это именно для этого случая