Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Getting position #10

Closed
robotex82 opened this issue Jul 6, 2011 · 3 comments
Closed

Getting position #10

robotex82 opened this issue Jul 6, 2011 · 3 comments

Comments

@robotex82
Copy link
Contributor

Hi,

I have an article model like this:

# == Schema Information
# Schema version: 20110705143543
#
# Table name: articles
#
#  id                         :integer         not null, primary key
#  issue_id                   :integer
#  issue_order                :integer
#  rubric_id                  :integer
#  heading                    :string(255)
#  teaser                     :text
#  body                       :text
#  preview_image_file_name    :string(255)
#  preview_image_content_type :string(255)
#  preview_image_file_size    :integer
#  preview_image_updated_at   :datetime
#  main_image_file_name       :string(255)
#  main_image_content_type    :string(255)
#  main_image_file_size       :integer
#  main_image_updated_at      :datetime
#  created_at                 :datetime
#  updated_at                 :datetime
#

class Article < ActiveRecord::Base
  include RankedModel
  ranks :issue_order, :with_same => :issue_id

  default_scope :order => 'issue_order DESC'

  belongs_to :issue
  belongs_to :rubric

  has_attached_file :preview_image
  has_attached_file :main_image

  validates_attachment_presence :preview_image
  validates_attachment_presence :main_image

  validates :body,        :presence => true
  validates :heading,     :presence => true
  validates :issue_id,    :presence => true
  validates :rubric_id,   :presence => true
  validates :teaser,      :presence => true

  def label
    heading
  end

  def issue_label
    issue.label
  end  

  def rubric_label
    rubric.label
  end  

  def rubric_color
    rubric.color
  end  
end

I created some articles:

Article.create!([
  { 
    :issue                 => issue, 
    :issue_order_position  => :first,
    :rubric                => Rubric.where(:name => "Zu Besuch bei...").first,
    :heading               => "Mousse T.", 
    :teaser                => "Der House-Meister", 
    :body                  => "DJmag trifft sich mit Peppermint Jams Labelboss Mousse T. anlässlich des 18-jährigen Labelgeburtstag.",
    :preview_image         => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'mousse_t_preview.jpg')),
    :main_image            => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'mousse_t.jpg')) 
  },
  { 
    :issue                 => issue,
    :issue_order_position  => :first,
    :rubric                => Rubric.where(:name => "Special").first,
    :heading               => "Ibiza",
    :teaser                => "Ein balearischer Summer of Love!",
    :body                  => "Was ist schöner als ein Sonnenaufgang an der Playa D'en Bossa nach 24 Stunden auf den Beinen? Oder charmanter als Alfredo, wenn er original balearische Beats in der dunstigen Wärme von Spaces-Premier Etage 25 Jahre später spielt? Oder am Flughafen nach einer ganztägigen Session im DC10 auf den Heimflug zu warten? Deine Füße und Beine sind dreckverschmiert und Deine verzerrten Gesichtszüge verstecken sich hinter dunklen Schatten - hast Du jemals schon eine solch intensive Mischung an Gefühlen erlebt? Diese Mixtur aus Euphorie, noch-bleiben-möchten und Angst-vor-der-Arbeit am nächsten Morgen? Nun, das ist Ibiza. Kein Ort auf der Welt - auch nicht die neuen Möchtegern-Locations, die gerade überall aus dem Boden sprießen - können ihr jemals gleichkommen. Sie ist ein Zufluchtsort, ein hedonistischer Traum und ein Wirbelwind aus Sonne, Meer und Sonics, ein Wegbereiter für Underground-Stars, die sich dort mit den größten, glamourösesten Namen der Dance-Szene die Klinke in die Hand geben.",
    :preview_image         => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'ibiza_preview.jpg')),
    :main_image            => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'ibiza.jpg')) 
  },
  { 
    :issue                 => issue,
    :issue_order_position  => :first,
    :rubric                => Rubric.where(:name => "Arts & Culture").first,
    :heading               => "Electro Punx",
    :teaser                => "Jetzt dreht Techno völlig durch!",
    :body                  => "Die elektronische Musikszene im Jahre 2011: Techno ist längst Main-stream geworden, Electro-House erobert international die Charts und obwohl es unzählige Facetten der elektronischen Musik gibt, schreit keine davon mehr wirklich \"Revolution!\". Doch halt! Schauen wir doch mal über die Landesgrenzen zu unseren Nachbarn in Belgien und Frankreich. Und schon werden wir fündig. Denn hier hat sich mit Acts wie Kap Bambino, Mon Corlonel und The Subs in den letzten Jahren eine kleine, aber umso wildere Electro-Szene gebildet, für die elektronische Musik viel mehr als nur Ausdruck von grenzenlosem Hedonismus ist und deren Acts mit viel Lust auf Krach, Krawall und oft auch politischen Statements den weiten Weg aus kleinen Kellerclubs bis auf die großen Festivals geschafft haben. Die Szene ist bestens vernetzt und steht mit ihrer herrlich durchgeknallten Wildheit in bester Tradition großer Vorbilder. So beziehen sich viele der Acts auf die Urväter des Electropunk, wie das legendäre New Yorker Projekt \"Suicide\" und vielen Tracks hört man auch an, dass hier neben belgischen Techno auch Industrial von Front 242 bis Nizzer Ebb als Grundlage für die - übrigens - höchst party-tauglichen Sounds diente. Wir stellen euch die wichtigsten Acts der Szene vor und schauen auch, wer sich im Deutschsprachigen Raum traut, richtig Krawall zu machen. Macht euch bereit für einen Besuch im Mosh Pit der Dancemusic, inklusive Stage-Diving, entblößter Oberkörper und jeder Menge rotziger Punk-Attitude!",
    :preview_image         => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'electro_punx_preview.jpg')), 
    :main_image            => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'electro_punx.jpg')) 
  },
  { 
    :issue                 => issue,
    :issue_order_position  => :first,
    :rubric                => Rubric.where(:name => "Fashion & Style").first,
    :heading               => "Blutsgeschwister",
    :teaser                => "Geschäftsführerin Karin Ziegler plaudert ein wenig aus dem Nähkästchen und erzählt uns die Geschichte zum Label.",
    :body                  => "Karin Ziegler und Stephan Künz sind die beiden Köpfe der Blutsgeschwister. Stephan hat Kommunikationswissenschaften studiert und im Anschluss ein Beratungsunternehmen im Bereich Marketing aufgebaut. Mehrere Jahre war er Marketingleiter beim größten Sportmode- und Sportartikelunternehmen im Alpenraum - der Sportler AG mit 500 Mitarbeitern. Seit August 2010 ist er bei Blutsgeschwister für Personal & Operations, Finance, Vertrieb & Retail, Marketing, Logistik und Einkauf verantwortlich. Was Karin vorher gemacht hat erzählt sie uns noch im Interview.",
    :preview_image         => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'blutsgeschwister_preview.jpg')), 
    :main_image            => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'blutsgeschwister.jpg')) 
  },
  { 
    :issue                 => issue,
    :issue_order_position  => :first,
    :rubric                => Rubric.where(:name => "Feature").first,
    :heading               => "Barem",
    :teaser                => "Die Ruhe nach dem Sturm",
    :body                  => "\"There is nothing better than a clear blue sky after the Storm\", und damit könnte der aus Argentinien stammenden Barem gar nicht so falsch liegen. Drei Jahre hat der Minus-Artist seit seinem letzen Release auf sich warten lassen. Nun ist er mit der ersten Singleauskopplung \"Blue\" und dem dazugehörigen, erstaunlich reif klingendem Albumdebüt \"After the storm\", zurück aus dem Studio. Mit uns plaudert er über die aktuelle Entwicklung der Szene, den kommenden Sommer und das neue Album...",  
    :preview_image         => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'barem_preview.jpg')), 
    :main_image            => File.open(File.join(Rails.root, 'db', 'assets', 'article', 'barem.jpg'))
  }
])

The ordering works as desired, but I can't get the position:

robo@Robo-VirtualBox:~/rails/djmag.de$ rails c
Loading development environment (Rails 3.0.7)
ruby-1.9.2-p136 :001 > Article.last.issue_order_position
 => nil 

Any clues?

Thanks in advance!

Cheers,

Roberto

@mixonic
Copy link
Contributor

mixonic commented Jul 6, 2011

Howdy robotex82,

RankedModel maintins a rank, not an explicit position. That's what allows for it's conservation of writes. There is an undocumented way to fetch the current_at_position:

https://github.com/harvesthq/ranked-model/blob/master/lib/ranked-model/ranker.rb#L70

But no way to ask a given object what it's position is. You can get it's rank by reading the raw attribute, issue_order in your case.

@mixonic mixonic closed this as completed Jul 6, 2011
@robotex82
Copy link
Contributor Author

Hi,

thanks for the answer. Unfortunately it's not quite what I need.

I've come up with this:

class Article < ActiveRecord::Base
  def issue_order_position
    self.class.where("issue_order < ?", issue_order).where("issue_id = ?", issue_id).size
  end  
end

What do you think? Any way to beautify it?

@mixonic
Copy link
Contributor

mixonic commented Jul 6, 2011

I would use .count instead of .size for sure (and :issue_id => issue_id instead of a SQL string, yech), but I think your method is a great idea!

Feel free to fork and kick in a patch for it if you can clean it up. If not I'm sure I'll fold it in before the next release.

A mild warning should be attached to this- COUNT can be slow on big tables. For small chunks of data this works, but for big data sets using a position accessor like this could be problematic for performance.

Nice thinkin'!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants