3 次程式碼提交

作者 SHA1 備註 提交日期
  Dylan Baker 903a329ffb Link directly to post 3 年之前
  Dylan Baker 7db28d294b Truncate post body in results 3 年之前
  Dylan Baker a4601594ea Allow running old migratinos 3 年之前
共有 5 個檔案被更改,包括 66 行新增37 行删除
  1. 2
    0
      Gemfile
  2. 5
    0
      Gemfile.lock
  3. 52
    35
      db/migrate.rb
  4. 5
    0
      web/server.rb
  5. 2
    2
      web/views/results.erb

+ 2
- 0
Gemfile 查看文件

@@ -13,3 +13,5 @@ gem 'rspec', '~> 3.9'
13 13
 gem 'sassc', '~> 2.2'
14 14
 gem 'sequel', '~> 5.30'
15 15
 gem 'sinatra', '~> 2.0'
16
+
17
+gem "truncato", "~> 0.7.11"

+ 5
- 0
Gemfile.lock 查看文件

@@ -4,6 +4,7 @@ GEM
4 4
     diff-lcs (1.3)
5 5
     dotenv (2.7.5)
6 6
     ffi (1.12.2)
7
+    htmlentities (4.3.4)
7 8
     httparty (0.18.0)
8 9
       mime-types (~> 3.0)
9 10
       multi_xml (>= 0.5.2)
@@ -44,6 +45,9 @@ GEM
44 45
       rack-protection (= 2.0.8.1)
45 46
       tilt (~> 2.0)
46 47
     tilt (2.0.10)
48
+    truncato (0.7.11)
49
+      htmlentities (~> 4.3.1)
50
+      nokogiri (>= 1.7.0, <= 2.0)
47 51
 
48 52
 PLATFORMS
49 53
   ruby
@@ -59,6 +63,7 @@ DEPENDENCIES
59 63
   sassc (~> 2.2)
60 64
   sequel (~> 5.30)
61 65
   sinatra (~> 2.0)
66
+  truncato (~> 0.7.11)
62 67
 
63 68
 BUNDLED WITH
64 69
    2.1.4

+ 52
- 35
db/migrate.rb 查看文件

@@ -1,9 +1,10 @@
1
+require 'pg'
1 2
 require 'sequel'
2 3
 
3 4
 require_relative 'connect'
4 5
 
5 6
 def migrate
6
-  db = connect
7
+  db = DB
7 8
   db.create_table? :threads do
8 9
     primary_key :id
9 10
     String :title
@@ -24,38 +25,54 @@ def migrate
24 25
     column :tsv, 'tsvector'
25 26
   end
26 27
 
27
-  db.run('CREATE INDEX tsv_idx ON posts USING gin(tsv);')
28
-
29
-  db.create_function?(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
30
-    BEGIN
31
-      UPDATE threads
32
-      SET
33
-        last_post_created_at = NEW.created_at,
34
-        last_post_creator = NEW.creator
35
-      WHERE
36
-        threads.id = NEW.thread_id;
37
-      RETURN NEW;
38
-    END
39
-  SQL
40
-
41
-  db.create_function?(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
42
-    BEGIN
43
-      NEW.tsv = to_tsvector(new.body);
44
-      RETURN NEW;
45
-    END
46
-  SQL
47
-
48
-  db.run(<<-SQL)
49
-    CREATE TRIGGER update_last_post
50
-    AFTER INSERT ON posts
51
-    FOR EACH ROW
52
-    EXECUTE PROCEDURE update_last_post();
53
-  SQL
54
-
55
-  db.run(<<-SQL)
56
-    CREATE TRIGGER set_posts_tsv
57
-    BEFORE INSERT OR UPDATE ON posts
58
-    FOR EACH ROW
59
-    EXECUTE PROCEDURE set_posts_tsv();
60
-  SQL
28
+  db.run('CREATE INDEX IF NOT EXISTS tsv_idx ON posts USING gin(tsv);')
29
+
30
+  begin
31
+    db.create_function(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
32
+      BEGIN
33
+        UPDATE threads
34
+        SET
35
+          last_post_created_at = NEW.created_at,
36
+          last_post_creator = NEW.creator
37
+        WHERE
38
+          threads.id = NEW.thread_id;
39
+        RETURN NEW;
40
+      END
41
+    SQL
42
+  rescue Sequel::DatabaseError => e
43
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
44
+  end
45
+
46
+  begin
47
+    db.create_function(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
48
+      BEGIN
49
+        NEW.tsv = to_tsvector(new.body);
50
+        RETURN NEW;
51
+      END
52
+    SQL
53
+  rescue Sequel::DatabaseError => e
54
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
55
+  end
56
+
57
+  begin
58
+    db.run(<<-SQL)
59
+      CREATE TRIGGER update_last_post
60
+      AFTER INSERT ON posts
61
+      FOR EACH ROW
62
+      EXECUTE PROCEDURE update_last_post();
63
+    SQL
64
+  rescue Sequel::DatabaseError => e
65
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
66
+  end
67
+
68
+  begin
69
+    db.run(<<-SQL)
70
+      CREATE TRIGGER set_posts_tsv
71
+      BEFORE INSERT OR UPDATE ON posts
72
+      FOR EACH ROW
73
+      EXECUTE PROCEDURE set_posts_tsv();
74
+    SQL
75
+  rescue Sequel::DatabaseError => e
76
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
77
+  end
61 78
 end

+ 5
- 0
web/server.rb 查看文件

@@ -1,6 +1,7 @@
1 1
 require 'dotenv/load'
2 2
 require 'sequel'
3 3
 require 'sinatra'
4
+require 'truncato'
4 5
 
5 6
 require_relative '../db/connect'
6 7
 require_relative '../lib/auth'
@@ -122,6 +123,10 @@ class VLVSearch < Sinatra::Base
122 123
     def external_link(url, text)
123 124
       "<a href=\"#{url}\" target=\"_blank\">#{text}</a>"
124 125
     end
126
+
127
+    def truncate(s)
128
+      Truncato.truncate(s, max_length: 500)
129
+    end
125 130
   end
126 131
 
127 132
   run! if __FILE__ == $0

+ 2
- 2
web/views/results.erb 查看文件

@@ -32,7 +32,7 @@
32 32
               In thread:
33 33
               <strong>
34 34
                 <%= external_link(
35
-                  "http://board.vivalavinyl.com/thread/view/#{result[:remote_thread_id]}",
35
+                  "http://board.vivalavinyl.com/thread/view/#{result[:remote_thread_id]}#post_#{result[:remote_id]}",
36 36
                   result[:thread_title]
37 37
                 ) %>
38 38
               </strong>
@@ -41,7 +41,7 @@
41 41
               <%= result[:creator] %> posted this at <%= result[:created_at] %>
42 42
             </p>
43 43
             <p class="result__body">
44
-              <%= result[:body] %>
44
+              <%= truncate(result[:body]) %>
45 45
             </p>
46 46
           <% end %>
47 47
         </div>

Loading…
取消
儲存