diff --git a/app/assets/javascripts/admin/templates/dashboard.hbs b/app/assets/javascripts/admin/templates/dashboard.hbs
index 039ed9844a3..b788bb08f0f 100644
--- a/app/assets/javascripts/admin/templates/dashboard.hbs
+++ b/app/assets/javascripts/admin/templates/dashboard.hbs
@@ -57,7 +57,6 @@
{{ render 'admin_report_counts' likes }}
{{ render 'admin_report_counts' flags }}
{{ render 'admin_report_counts' bookmarks }}
- {{ render 'admin_report_counts' starred }}
{{ render 'admin_report_counts' emails }}
{{/unless}}
diff --git a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6
index 2f9c73c6052..544684c1950 100644
--- a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6
+++ b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6
@@ -165,7 +165,7 @@ var controllerOpts = {
var split = this.get('filter').split('/');
- if (split[0] !== 'new' && split[0] !== 'unread' && split[0] !== 'starred') { return; }
+ if (split[0] !== 'new' && split[0] !== 'unread') { return; }
return I18n.t("topics.none.educate." + split[0], {
userPrefsUrl: Discourse.getURL("/users/") + (Discourse.User.currentProp("username_lower")) + "/preferences"
diff --git a/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js b/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js
index 9fc70afbdc5..d7c6d0c1490 100644
--- a/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js
+++ b/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js
@@ -3,7 +3,6 @@ var PATH_BINDINGS = {
'g l': '/latest',
'g n': '/new',
'g u': '/unread',
- 'g f': '/starred',
'g c': '/categories',
'g t': '/top'
},
diff --git a/app/assets/javascripts/discourse/models/nav_item.js b/app/assets/javascripts/discourse/models/nav_item.js
index b79cd023991..c081fbcd2f8 100644
--- a/app/assets/javascripts/discourse/models/nav_item.js
+++ b/app/assets/javascripts/discourse/models/nav_item.js
@@ -74,7 +74,7 @@ Discourse.NavItem.reopenClass({
if (!Discourse.Category.list() && testName === "categories") return null;
if (!Discourse.Site.currentProp('top_menu_items').contains(testName)) return null;
- var args = { name: name, hasIcon: name === "unread" || name === "starred" };
+ var args = { name: name, hasIcon: name === "unread" };
if (opts.category) { args.category = opts.category; }
if (opts.noSubcategories) { args.noSubcategories = true; }
return Discourse.NavItem.create(args);
diff --git a/app/assets/javascripts/discourse/models/topic.js b/app/assets/javascripts/discourse/models/topic.js
index 57fe8d907a7..f4b13f818dd 100644
--- a/app/assets/javascripts/discourse/models/topic.js
+++ b/app/assets/javascripts/discourse/models/topic.js
@@ -172,14 +172,6 @@ Discourse.Topic = Discourse.Model.extend({
.then(function () { self.set('archetype', 'regular'); });
},
- starTooltipKey: function() {
- return this.get('starred') ? 'starred.help.unstar' : 'starred.help.star';
- }.property('starred'),
-
- starTooltip: function() {
- return I18n.t(this.get('starTooltipKey'));
- }.property('starTooltipKey'),
-
estimatedReadingTime: function() {
var wordCount = this.get('word_count');
if (!wordCount) return;
@@ -188,15 +180,15 @@ Discourse.Topic = Discourse.Model.extend({
return Math.floor(wordCount / 500.0);
}.property('word_count'),
- toggleStar: function() {
+ toggleBookmark: function() {
var topic = this;
- topic.toggleProperty('starred');
+ topic.toggleProperty('bookmarked');
return Discourse.ajax({
- url: "" + (this.get('url')) + "/star",
+ url: "" + (this.get('url')) + "/bookmark",
type: 'PUT',
- data: { starred: topic.get('starred') ? true : false }
+ data: { bookmarked: topic.get('bookmarked') ? true : false }
}).then(null, function (error) {
- topic.toggleProperty('starred');
+ topic.toggleProperty('bookmarked');
if (error && error.responseText) {
bootbox.alert($.parseJSON(error.responseText).errors);
diff --git a/app/assets/javascripts/discourse/models/user_action.js b/app/assets/javascripts/discourse/models/user_action.js
index fd88f179170..ba555e84838 100644
--- a/app/assets/javascripts/discourse/models/user_action.js
+++ b/app/assets/javascripts/discourse/models/user_action.js
@@ -16,7 +16,6 @@ var UserActionTypes = {
replies: 6,
mentions: 7,
quotes: 9,
- starred: 10,
edits: 11,
messages_sent: 12,
messages_received: 13
@@ -127,8 +126,6 @@ Discourse.UserAction = Discourse.Model.extend({
case UserActionTypes.likes_given:
case UserActionTypes.likes_received:
return "likes";
- case UserActionTypes.starred:
- return "stars";
case UserActionTypes.edits:
return "edits";
case UserActionTypes.bookmarks:
@@ -205,7 +202,6 @@ Discourse.UserAction.reopenClass({
TO_COLLAPSE: [
UserActionTypes.likes_given,
UserActionTypes.likes_received,
- UserActionTypes.starred,
UserActionTypes.edits,
UserActionTypes.bookmarks
],
@@ -213,7 +209,6 @@ Discourse.UserAction.reopenClass({
TO_SHOW: [
UserActionTypes.likes_given,
UserActionTypes.likes_received,
- UserActionTypes.starred,
UserActionTypes.edits,
UserActionTypes.bookmarks,
UserActionTypes.messages_sent,
diff --git a/app/assets/javascripts/discourse/routes/user-activity-starred.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-starred.js.es6
deleted file mode 100644
index 2e74e1ddcbe..00000000000
--- a/app/assets/javascripts/discourse/routes/user-activity-starred.js.es6
+++ /dev/null
@@ -1,9 +0,0 @@
-import UserTopicListRoute from "discourse/routes/user-topic-list";
-
-export default UserTopicListRoute.extend({
- userActionType: Discourse.UserAction.TYPES.starred,
-
- model: function() {
- return Discourse.TopicList.find('starred', { user_id: this.modelFor('user').get('id') });
- }
-});
diff --git a/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs b/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs
index 64de5b26139..c13311cea04 100644
--- a/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs
+++ b/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs
@@ -7,7 +7,6 @@
{{{i18n 'keyboard_shortcuts_help.jump_to.latest'}}}
{{{i18n 'keyboard_shortcuts_help.jump_to.new'}}}
{{{i18n 'keyboard_shortcuts_help.jump_to.unread'}}}
- {{{i18n 'keyboard_shortcuts_help.jump_to.starred'}}}
{{{i18n 'keyboard_shortcuts_help.jump_to.categories'}}}
{{{i18n 'keyboard_shortcuts_help.jump_to.top'}}}
diff --git a/app/assets/javascripts/discourse/views/activity-filter.js.es6 b/app/assets/javascripts/discourse/views/activity-filter.js.es6
index 24445239d0b..7a7ed0f2a4c 100644
--- a/app/assets/javascripts/discourse/views/activity-filter.js.es6
+++ b/app/assets/javascripts/discourse/views/activity-filter.js.es6
@@ -54,7 +54,6 @@ export default Ember.Component.extend(StringBuffer, {
case Discourse.UserAction.TYPES.bookmarks: return "bookmark";
case Discourse.UserAction.TYPES.edits: return "pencil";
case Discourse.UserAction.TYPES.replies: return "reply";
- case Discourse.UserAction.TYPES.starred: return "star";
}
}.property("content.action_type")
});
diff --git a/app/assets/javascripts/discourse/views/star-button.js.es6 b/app/assets/javascripts/discourse/views/star-button.js.es6
deleted file mode 100644
index c87aea9f246..00000000000
--- a/app/assets/javascripts/discourse/views/star-button.js.es6
+++ /dev/null
@@ -1,21 +0,0 @@
-import ButtonView from 'discourse/views/button';
-
-export default ButtonView.extend({
- classNames: ['star'],
- textKey: 'starred.title',
- helpKeyBinding: 'controller.starTooltipKey',
- attributeBindings: ['disabled'],
-
- rerenderTriggers: ['controller.starred'],
-
- click: function() {
- this.get('controller').send('toggleStar');
- },
-
- renderIcon: function(buffer) {
- buffer.push("");
- }
-});
-
diff --git a/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 b/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6
index d94cead5c2e..918845ca6fd 100644
--- a/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6
+++ b/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6
@@ -1,7 +1,6 @@
import TopicAdminMenuButton from 'discourse/views/topic-admin-menu-button';
import LoginReplyButton from 'discourse/views/login-reply-button';
import FlagTopicButton from 'discourse/views/flag-topic-button';
-import StarButton from 'discourse/views/star-button';
import ShareButton from 'discourse/views/share-button';
import InviteReplyButton from 'discourse/views/invite-reply-button';
import ReplyButton from 'discourse/views/reply-button';
@@ -30,7 +29,6 @@ export default DiscourseContainerView.extend({
if (this.get('topic.details.can_invite_to')) {
this.attachViewClass(InviteReplyButton);
}
- this.attachViewClass(StarButton);
this.attachViewClass(ShareButton);
if (this.get('topic.details.can_flag_topic')) {
this.attachViewClass(FlagTopicButton);
diff --git a/app/assets/stylesheets/common/base/_topic-list.scss b/app/assets/stylesheets/common/base/_topic-list.scss
index 6a477b28890..751adbada01 100644
--- a/app/assets/stylesheets/common/base/_topic-list.scss
+++ b/app/assets/stylesheets/common/base/_topic-list.scss
@@ -10,9 +10,6 @@
margin-right: 4px;
font: 1.071em/0.9 "FontAwesome";
}
- .has-icon .starred:before {
- content: "\f005";
- }
}
}
diff --git a/app/assets/stylesheets/desktop/discourse.scss b/app/assets/stylesheets/desktop/discourse.scss
index 7bc5d8848eb..e35b97994c8 100644
--- a/app/assets/stylesheets/desktop/discourse.scss
+++ b/app/assets/stylesheets/desktop/discourse.scss
@@ -36,24 +36,12 @@ body {
}
}
#main {
- .fa-star.starred {
- color: $danger;
- }
a.star {
color: dark-light-diff($secondary, $primary, 80%, -20%);
&:before {
font-family: "FontAwesome";
content: "\f005";
}
- &.starred {
- color: $danger;
- @include hover {
- opacity: 1;
- &:before {
- content: "\f005";
- }
- }
- }
@include hover {
opacity: 0.6;
}
diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss
index b2ec22dfcf4..e0209023354 100644
--- a/app/assets/stylesheets/desktop/topic-post.scss
+++ b/app/assets/stylesheets/desktop/topic-post.scss
@@ -551,12 +551,6 @@ video {
line-height: 1.3em;
}
- a.star {
- margin: 0 7px 20px 2px;
- color: dark-light-diff($secondary, $primary, 80%, -20%) !important;
- }
- a.star.starred {color: $danger !important;}
-
.topic-statuses {
margin-top: -2px;
}
diff --git a/app/assets/stylesheets/mobile/discourse.scss b/app/assets/stylesheets/mobile/discourse.scss
index e22c9c93db2..65e44681416 100644
--- a/app/assets/stylesheets/mobile/discourse.scss
+++ b/app/assets/stylesheets/mobile/discourse.scss
@@ -18,36 +18,6 @@ body {
}
}
#main {
- .fa-star.starred {
- color: $danger;
- }
- a.star {
- display: inline-block;
- font-size: 1.429em;
- color: scale-color($primary, $lightness: 75%);
- margin-right: 8px;
- margin-top: 4px;
- &:before {
- font-family: "FontAwesome";
- content: "\f005";
- }
- &.starred {
- color: $danger;
- @include hover {
- opacity: 1;
- &:before {
- content: "\f005";
- }
- }
- }
- @include hover {
- opacity: 0.6;
- }
-
- &:active {
- opacity: 1;
- }
- }
img.avatar {
&.header {
width: 45px;
diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb
index 73bc006ae35..6ca4ac35b60 100644
--- a/app/controllers/topics_controller.rb
+++ b/app/controllers/topics_controller.rb
@@ -166,14 +166,6 @@ class TopicsController < ApplicationController
render nothing: true
end
- def star
- @topic = Topic.find_by(id: params[:topic_id].to_i)
- guardian.ensure_can_see!(@topic)
-
- @topic.toggle_star(current_user, params[:starred] == 'true')
- render nothing: true
- end
-
def mute
toggle_mute
end
diff --git a/app/models/admin_dashboard_data.rb b/app/models/admin_dashboard_data.rb
index 4f4ff28022b..ccb1db1d69d 100644
--- a/app/models/admin_dashboard_data.rb
+++ b/app/models/admin_dashboard_data.rb
@@ -11,7 +11,6 @@ class AdminDashboardData
'users_by_trust_level',
'likes',
'bookmarks',
- 'starred',
'emails',
'user_to_user_private_messages',
'system_private_messages',
diff --git a/app/models/report.rb b/app/models/report.rb
index 51f4d0a6cc5..3cabe43497f 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -91,13 +91,7 @@ class Report
end
end
- def self.report_starred(report)
- basic_report_about report, Topic, :starred_counts_per_day, default_days
- add_counts report, TopicUser.where(starred: true), 'topic_users.starred_at'
- end
-
# Post action counts:
-
def self.report_flags(report)
basic_report_about report, PostAction, :flag_count_by_date, report.start_date, report.end_date
add_counts report, PostAction.where(post_action_type_id: PostActionType.flag_types.values), 'post_actions.created_at'
diff --git a/app/models/topic.rb b/app/models/topic.rb
index 2eab5fe2d0b..13f507b63c3 100644
--- a/app/models/topic.rb
+++ b/app/models/topic.rb
@@ -141,13 +141,6 @@ class Topic < ActiveRecord::Base
WHERE #{condition[0]})", condition[1])
}
- # Helps us limit how many topics can be starred in a day
- class StarLimiter < RateLimiter
- def initialize(user)
- super(user, "starred:#{Date.today}", SiteSetting.max_stars_per_day, 1.day.to_i)
- end
- end
-
attr_accessor :ignore_category_auto_close
attr_accessor :skip_callbacks
@@ -612,27 +605,6 @@ class Topic < ActiveRecord::Base
@participants_summary ||= TopicParticipantsSummary.new(self, options).summary
end
- # Enable/disable the star on the topic
- def toggle_star(user, starred)
- Topic.transaction do
- TopicUser.change(user, id, {starred: starred}.merge( starred ? {starred_at: DateTime.now, unstarred_at: nil} : {unstarred_at: DateTime.now}))
-
- # Update the star count
- exec_sql "UPDATE topics
- SET star_count = (SELECT COUNT(*)
- FROM topic_users AS ftu
- WHERE ftu.topic_id = topics.id
- AND ftu.starred = true)
- WHERE id = ?", id
-
- if starred
- StarLimiter.new(user).performed!
- else
- StarLimiter.new(user).rollback!
- end
- end
- end
-
def make_banner!(user)
# only one banner at the same time
previous_banner = Topic.where(archetype: Archetype.banner).first
@@ -662,10 +634,6 @@ class Topic < ActiveRecord::Base
}
end
- def self.starred_counts_per_day(sinceDaysAgo=30)
- TopicUser.starred_since(sinceDaysAgo).by_date_starred.count
- end
-
# Even if the slug column in the database is null, topic.slug will return something:
def slug
unless slug = read_attribute(:slug)
diff --git a/app/models/topic_user.rb b/app/models/topic_user.rb
index a70bf224ad9..7996f1f0f38 100644
--- a/app/models/topic_user.rb
+++ b/app/models/topic_user.rb
@@ -2,9 +2,6 @@ class TopicUser < ActiveRecord::Base
belongs_to :user
belongs_to :topic
- scope :starred_since, lambda { |sinceDaysAgo| where('starred_at > ?', sinceDaysAgo.days.ago) }
- scope :by_date_starred, -> { group('date(starred_at)').order('date(starred_at)') }
-
scope :tracking, lambda { |topic_id|
where(topic_id: topic_id)
.where("COALESCE(topic_users.notification_level, :regular) >= :tracking",
@@ -86,8 +83,6 @@ class TopicUser < ActiveRecord::Base
TopicUser.transaction do
attrs = attrs.dup
- attrs[:starred_at] = DateTime.now if attrs[:starred_at].nil? && attrs[:starred]
-
if attrs[:notification_level]
attrs[:notifications_changed_at] ||= DateTime.now
attrs[:notifications_reason_id] ||= TopicUser.notification_reasons[:user_changed]
diff --git a/app/models/user_action.rb b/app/models/user_action.rb
index 6cd1f24a572..95f87387d5e 100644
--- a/app/models/user_action.rb
+++ b/app/models/user_action.rb
@@ -14,7 +14,6 @@ class UserAction < ActiveRecord::Base
RESPONSE= 6
MENTION = 7
QUOTE = 9
- STAR = 10
EDIT = 11
NEW_PRIVATE_MESSAGE = 12
GOT_PRIVATE_MESSAGE = 13
@@ -30,7 +29,6 @@ class UserAction < ActiveRecord::Base
MENTION,
QUOTE,
BOOKMARK,
- STAR,
EDIT
].each_with_index.to_a.flatten]
@@ -240,35 +238,8 @@ SQL
builder.exec
end
- def self.synchronize_starred
- exec_sql("
- DELETE FROM user_actions ua
- WHERE action_type = :star
- AND NOT EXISTS (
- SELECT 1 FROM topic_users tu
- WHERE
- tu.user_id = ua.user_id AND
- tu.topic_id = ua.target_topic_id AND
- starred
- )", star: UserAction::STAR)
-
- exec_sql("INSERT INTO user_actions
- (action_type, user_id, target_topic_id, target_post_id, acting_user_id, created_at, updated_at)
- SELECT :star, tu.user_id, tu.topic_id, -1, tu.user_id, tu.starred_at, tu.starred_at
- FROM topic_users tu
- WHERE starred AND NOT EXISTS(
- SELECT 1 FROM user_actions ua
- WHERE tu.user_id = ua.user_id AND
- tu.topic_id = ua.target_topic_id AND
- ua.action_type = :star
- )
- ", star: UserAction::STAR)
-
- end
-
def self.ensure_consistency!
self.synchronize_target_topic_ids
- self.synchronize_starred
end
def self.update_like_count(user_id, action_type, delta)
@@ -294,7 +265,7 @@ SQL
end
unless (guardian.user && guardian.user.id == user_id) || guardian.is_staff?
- builder.where("a.action_type not in (#{BOOKMARK},#{STAR})")
+ builder.where("a.action_type not in (#{BOOKMARK})")
builder.where("t.visible")
end
diff --git a/app/models/user_action_observer.rb b/app/models/user_action_observer.rb
index 45fba906458..a7e79ac9287 100644
--- a/app/models/user_action_observer.rb
+++ b/app/models/user_action_observer.rb
@@ -9,27 +9,6 @@ class UserActionObserver < ActiveRecord::Observer
log_topic(model)
when (model.is_a?(Post))
log_post(model)
- when (model.is_a?(TopicUser))
- log_topic_user(model)
- end
- end
-
- def log_topic_user(model)
- action = UserAction::STAR
-
- row = {
- action_type: action,
- user_id: model.user_id,
- acting_user_id: model.user_id,
- target_topic_id: model.topic_id,
- target_post_id: -1,
- created_at: model.starred_at
- }
-
- if model.starred
- UserAction.log_action!(row)
- else
- UserAction.remove_action!(row)
end
end
diff --git a/app/serializers/topic_list_item_serializer.rb b/app/serializers/topic_list_item_serializer.rb
index 97adc464fec..c22560d8b09 100644
--- a/app/serializers/topic_list_item_serializer.rb
+++ b/app/serializers/topic_list_item_serializer.rb
@@ -2,7 +2,6 @@ class TopicListItemSerializer < ListableTopicSerializer
attributes :views,
:like_count,
- :starred,
:has_summary,
:archetype,
:last_poster_username,
@@ -13,12 +12,6 @@ class TopicListItemSerializer < ListableTopicSerializer
has_many :posters, serializer: TopicPosterSerializer, embed: :objects
has_many :participants, serializer: TopicPosterSerializer, embed: :objects
- def starred
- object.user_data.starred?
- end
-
- alias :include_starred? :has_user_data
-
def posters
object.posters || []
end
diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb
index 92c08c34620..c48c2c1d3f2 100644
--- a/app/serializers/topic_view_serializer.rb
+++ b/app/serializers/topic_view_serializer.rb
@@ -29,7 +29,6 @@ class TopicViewSerializer < ApplicationSerializer
attributes :draft,
:draft_key,
:draft_sequence,
- :starred,
:posted,
:unpinned,
:pinned_globally,
@@ -145,11 +144,6 @@ class TopicViewSerializer < ApplicationSerializer
object.topic_user.present?
end
- def starred
- object.topic_user.starred?
- end
- alias_method :include_starred?, :has_topic_user?
-
def highest_post_number
object.highest_post_number
end
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 5e206b06de6..3a931ef154a 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -785,12 +785,6 @@ en:
not_logged_in_user: 'user page with summary of current activity and preferences'
current_user: 'go to your user page'
- starred:
- title: 'Star'
- help:
- star: 'add this topic to your starred list'
- unstar: 'remove this topic from your starred list'
-
topics:
bulk:
reset_read: "Reset Read"
@@ -811,7 +805,6 @@ en:
other: "You have selected {{count}} topics."
none:
- starred: "You have no starred topics."
unread: "You have no unread topics."
new: "You have no new topics."
read: "You haven't read any topics yet."
@@ -823,7 +816,6 @@ en:
educate:
new: 'Your new topics appear here.
By default, topics are considered new and will show a new indicator if they were created in the last 2 days.
You can change this in your preferences.
'
unread: 'Your unread topics appear here.
By default, topics are considered unread and will show unread counts 1 if you:
- Created the topic
- Replied to the topic
- Read the topic for more than 4 minutes
Or if you have explicitly set the topic to Tracked or Watched via the notification control at the bottom of each topic.
You can change this in your preferences.
'
- starred: 'Your starred topics appear here.
To star or unstar a topic, use:
- the next to any topic title
- the Star button at the bottom of each topic
'
bottom:
latest: "There are no more latest topics."
hot: "There are no more hot topics."
@@ -831,7 +823,6 @@ en:
read: "There are no more read topics."
new: "There are no more new topics."
unread: "There are no more unread topics."
- starred: "There are no more starred topics."
category: "There are no more {{category}} topics."
top: "There are no more top topics."
@@ -1433,9 +1424,6 @@ en:
hot:
title: "Hot"
help: "a selection of the hottest topics"
- starred:
- title: "Starred"
- help: "topics you starred"
read:
title: "Read"
help: "topics you've read, in the order that you last read them"
@@ -2217,7 +2205,6 @@ en:
latest: 'g, l Latest'
new: 'g, n New'
unread: 'g, u Unread'
- starred: 'g, f Starred'
categories: 'g, c Categories'
top: 'g, t Top'
navigation:
diff --git a/db/migrate/20150106215342_remove_stars.rb b/db/migrate/20150106215342_remove_stars.rb
new file mode 100644
index 00000000000..7e5f6e44d9e
--- /dev/null
+++ b/db/migrate/20150106215342_remove_stars.rb
@@ -0,0 +1,29 @@
+class RemoveStars < ActiveRecord::Migration
+ def up
+ r = execute <