post.rb 9.9 KB
Newer Older
1
class Post < ActiveRecord::Base
2 3 4 5 6 7
  class CategoryPost < ActiveRecord::Base
    self.table_name = "categories_posts"
    belongs_to :category
    belongs_to :post
  end

P
Pratik Naik 已提交
8 9
  module NamedExtension
    def author
10
      "lifo"
P
Pratik Naik 已提交
11 12 13
    end
  end

J
Jon Leighton 已提交
14 15 16 17 18 19
  module NamedExtension2
    def greeting
      "hello"
    end
  end

J
Jon Leighton 已提交
20
  scope :containing_the_letter_a, -> { where("body LIKE '%a%'") }
21
  scope :titled_with_an_apostrophe, -> { where("title LIKE '%''%'") }
J
Jon Leighton 已提交
22
  scope :ranked_by_comments,      -> { order("comments_count DESC") }
23

24
  scope :limit_by, lambda {|l| limit(l) }
25

26
  belongs_to :author
27

28 29
  belongs_to :author_with_posts, -> { includes(:posts) }, class_name: "Author", foreign_key: :author_id
  belongs_to :author_with_address, -> { includes(:author_address) }, class_name: "Author", foreign_key: :author_id
30

31 32 33
  def first_comment
    super.body
  end
34 35
  has_one :first_comment, -> { order("id ASC") }, class_name: "Comment"
  has_one :last_comment, -> { order("id desc") }, class_name: "Comment"
36

37 38 39
  scope :with_special_comments, -> { joins(:comments).where(comments: {type: "SpecialComment"}) }
  scope :with_very_special_comments, -> { joins(:comments).where(comments: {type: "VerySpecialComment"}) }
  scope :with_post, ->(post_id) { joins(:comments).where(comments: { post_id: post_id }) }
40

41 42 43
  scope :with_comments, -> { preload(:comments) }
  scope :with_tags, -> { preload(:taggings) }

44
  scope :tagged_with, ->(id) { joins(:taggings).where(taggings: { tag_id: id }) }
45
  scope :tagged_with_comment, ->(comment) { joins(:taggings).where(taggings: { comment: comment }) }
46

47 48
  scope :typographically_interesting, -> { containing_the_letter_a.or(titled_with_an_apostrophe) }

49
  has_many   :comments do
50
    def find_most_recent
51
      order("id DESC").first
52
    end
A
Arun Agrawal 已提交
53 54 55 56

    def newest
      created.last
    end
57 58 59 60

    def the_association
      proxy_association
    end
61
  end
62

J
Jon Leighton 已提交
63 64 65 66 67 68 69 70
  has_many :comments_with_extend, extend: NamedExtension, class_name: "Comment", foreign_key: "post_id" do
    def greeting
      "hello"
    end
  end

  has_many :comments_with_extend_2, extend: [NamedExtension, NamedExtension2], class_name: "Comment", foreign_key: "post_id"

71 72 73
  has_many :author_favorites, through: :author
  has_many :author_categorizations, through: :author, source: :categorizations
  has_many :author_addresses, through: :author
74 75 76
  has_many :author_address_extra_with_address,
    through: :author_with_address,
    source: :author_address_extra
77

78
  has_one  :very_special_comment
79
  has_one  :very_special_comment_with_post, -> { includes(:post) }, class_name: "VerySpecialComment"
80
  has_one :very_special_comment_with_post_with_joins, -> { joins(:post).order("posts.id") }, class_name: "VerySpecialComment"
81
  has_many :special_comments
82
  has_many :nonexistent_comments, -> { where "comments.id < 0" }, class_name: "Comment"
J
Jon Leighton 已提交
83

84 85
  has_many :special_comments_ratings, through: :special_comments, source: :ratings
  has_many :special_comments_ratings_taggings, through: :special_comments_ratings, source: :taggings
86

87
  has_many :category_posts, class_name: "CategoryPost"
88
  has_many :scategories, through: :category_posts, source: :category
89
  has_and_belongs_to_many :categories
90
  has_and_belongs_to_many :special_categories, join_table: "categories_posts", association_foreign_key: "category_id"
91

92 93
  has_many :taggings, as: :taggable, counter_cache: :tags_count
  has_many :tags, through: :taggings do
94
    def add_joins_and_select
95 96
      select("tags.*, authors.id as author_id")
        .joins("left outer join posts on taggings.taggable_id = posts.id left outer join authors on posts.author_id = authors.id")
97
        .to_a
98 99
    end
  end
J
Jeremy Kemper 已提交
100

101 102
  has_many :taggings_with_delete_all, class_name: "Tagging", as: :taggable, dependent: :delete_all, counter_cache: :taggings_with_delete_all_count
  has_many :taggings_with_destroy, class_name: "Tagging", as: :taggable, dependent: :destroy, counter_cache: :taggings_with_destroy_count
103

104 105
  has_many :tags_with_destroy, through: :taggings, source: :tag, dependent: :destroy, counter_cache: :tags_with_destroy_count
  has_many :tags_with_nullify, through: :taggings, source: :tag, dependent: :nullify, counter_cache: :tags_with_nullify_count
106

107 108 109 110 111
  has_many :misc_tags, -> { where tags: { name: "Misc" } }, through: :taggings, source: :tag
  has_many :funky_tags, through: :taggings, source: :tag
  has_many :super_tags, through: :taggings
  has_many :tags_with_primary_key, through: :taggings, source: :tag_with_primary_key
  has_one :tagging, as: :taggable
J
Jon Leighton 已提交
112

113 114
  has_many :first_taggings, -> { where taggings: { comment: "first" } }, as: :taggable, class_name: "Tagging"
  has_many :first_blue_tags, -> { where tags: { name: "Blue" } }, through: :first_taggings, source: :tag
115

116
  has_many :first_blue_tags_2, -> { where taggings: { comment: "first" } }, through: :taggings, source: :blue_tag
117

118 119
  has_many :invalid_taggings, -> { where "taggings.id < 0" }, as: :taggable, class_name: "Tagging"
  has_many :invalid_tags, through: :invalid_taggings, source: :tag
120

121 122
  has_many :categorizations, foreign_key: :category_id
  has_many :authors, through: :categorizations
123

124 125
  has_many :categorizations_using_author_id, primary_key: :author_id, foreign_key: :post_id, class_name: "Categorization"
  has_many :authors_using_author_id, through: :categorizations_using_author_id, source: :author
126

127 128
  has_many :taggings_using_author_id, primary_key: :author_id, as: :taggable, class_name: "Tagging"
  has_many :tags_using_author_id, through: :taggings_using_author_id, source: :tag
129

130 131
  has_many :images, as: :imageable, foreign_key: :imageable_identifier, foreign_type: :imageable_class
  has_one :main_image, as: :imageable, foreign_key: :imageable_identifier, foreign_type: :imageable_class, class_name: "Image"
132

133 134 135 136
  has_many :standard_categorizations, class_name: "Categorization", foreign_key: :post_id
  has_many :author_using_custom_pk,  through: :standard_categorizations
  has_many :authors_using_custom_pk, through: :standard_categorizations
  has_many :named_categories, through: :standard_categorizations
137

138
  has_many :readers
139
  has_many :secure_readers
140 141 142 143 144 145 146 147 148 149
  has_many :readers_with_person, -> { includes(:person) }, class_name: "Reader"
  has_many :people, through: :readers
  has_many :single_people, through: :readers
  has_many :people_with_callbacks, source: :person, through: :readers,
              before_add: lambda {|owner, reader| log(:added,   :before, reader.first_name) },
              after_add: lambda {|owner, reader| log(:added,   :after,  reader.first_name) },
              before_remove: lambda {|owner, reader| log(:removed, :before, reader.first_name) },
              after_remove: lambda {|owner, reader| log(:removed, :after,  reader.first_name) }
  has_many :skimmers, -> { where skimmer: true }, class_name: "Reader"
  has_many :impatient_people, through: :skimmers, source: :person
150

151
  has_many :lazy_readers
152
  has_many :lazy_readers_skimmers_or_not, -> { where(skimmer: [ true, false ]) }, class_name: "LazyReader"
153

154 155 156
  has_many :lazy_people, through: :lazy_readers, source: :person
  has_many :lazy_readers_unscope_skimmers, -> { skimmers_or_not }, class_name: "LazyReader"
  has_many :lazy_people_unscope_skimmers, through: :lazy_readers_unscope_skimmers, source: :person
157

158
  def self.top(limit)
159
    ranked_by_comments.limit_by(limit)
160 161
  end

162 163 164 165
  def self.written_by(author)
    where(id: author.posts.pluck(:id))
  end

166 167 168
  def self.reset_log
    @log = []
  end
169

170 171 172 173
  def self.log(message=nil, side=nil, new_record=nil)
    return @log if message.nil?
    @log << [message, side, new_record]
  end
174 175
end

176
class SpecialPost < Post; end
177 178

class StiPost < Post
179
  self.abstract_class = true
180
  has_one :special_comment, class_name: "SpecialComment"
181
end
182 183

class SubStiPost < StiPost
184
  self.table_name = Post.table_name
185
end
186

187
class FirstPost < ActiveRecord::Base
C
Cody Cutrer 已提交
188
  self.inheritance_column = :disabled
189
  self.table_name = "posts"
190
  default_scope { where(id: 1) }
191

192 193
  has_many :comments, foreign_key: :post_id
  has_one  :comment,  foreign_key: :post_id
194
end
195 196

class PostWithDefaultInclude < ActiveRecord::Base
C
Cody Cutrer 已提交
197
  self.inheritance_column = :disabled
198
  self.table_name = "posts"
J
Jon Leighton 已提交
199
  default_scope { includes(:comments) }
200
  has_many :comments, foreign_key: :post_id
201 202
end

203
class PostWithSpecialCategorization < Post
204 205
  has_many :categorizations, foreign_key: :post_id
  default_scope { where(type: "PostWithSpecialCategorization").joins(:categorizations).where(categorizations: { special: true }) }
206 207
end

208
class PostWithDefaultScope < ActiveRecord::Base
C
Cody Cutrer 已提交
209
  self.inheritance_column = :disabled
210
  self.table_name = "posts"
J
Jon Leighton 已提交
211
  default_scope { order(:title) }
212 213
end

214
class PostWithPreloadDefaultScope < ActiveRecord::Base
215
  self.table_name = "posts"
216

217
  has_many :readers, foreign_key: "post_id"
218 219 220 221 222

  default_scope { preload(:readers) }
end

class PostWithIncludesDefaultScope < ActiveRecord::Base
223
  self.table_name = "posts"
224

225
  has_many :readers, foreign_key: "post_id"
226 227 228 229

  default_scope { includes(:readers) }
end

230
class SpecialPostWithDefaultScope < ActiveRecord::Base
C
Cody Cutrer 已提交
231
  self.inheritance_column = :disabled
232
  self.table_name = "posts"
233
  default_scope { where(id: [1, 5,6]) }
234
end
235 236

class PostThatLoadsCommentsInAnAfterSaveHook < ActiveRecord::Base
C
Cody Cutrer 已提交
237
  self.inheritance_column = :disabled
238
  self.table_name = "posts"
239
  has_many :comments, class_name: "CommentThatAutomaticallyAltersPostBody", foreign_key: :post_id
240

241 242 243 244
  after_save do |post|
    post.comments.load
  end
end
245

246
class PostWithAfterCreateCallback < ActiveRecord::Base
C
Cody Cutrer 已提交
247
  self.inheritance_column = :disabled
248
  self.table_name = "posts"
249 250 251 252 253 254 255
  has_many :comments, foreign_key: :post_id

  after_create do |post|
    update_attribute(:author_id, comments.first.id)
  end
end

256
class PostWithCommentWithDefaultScopeReferencesAssociation < ActiveRecord::Base
C
Cody Cutrer 已提交
257
  self.inheritance_column = :disabled
258
  self.table_name = "posts"
259 260 261
  has_many :comment_with_default_scope_references_associations, foreign_key: :post_id
  has_one :first_comment, class_name: "CommentWithDefaultScopeReferencesAssociation", foreign_key: :post_id
end
262 263 264 265

class SerializedPost < ActiveRecord::Base
  serialize :title
end
266 267

class ConditionalStiPost < Post
268
  default_scope { where(title: "Untitled") }
269 270 271 272
end

class SubConditionalStiPost < ConditionalStiPost
end