Sie könnten verwenden Array#from
, um die Paginierung zu simulieren, aber das eigentliche Problem hier ist, dass Sie überhaupt nicht verwenden sollten Array
.
Dafür sind ActiveRecord- Zuordnungen gemacht. Sie sollten diese Anleitung sorgfältig lesen. Es gibt viele nützliche Dinge, die Sie wissen müssen, wenn Sie Rails-Anwendungen entwickeln.
Lassen Sie mich Ihnen einen besseren Weg zeigen, dasselbe zu tun:
class Profile < ActiveRecord::Base
has_many :opinion_ratings
has_many :opinions, :through => :opinion_ratings
end
class Opinion < ActiveRecord::Base
has_many :opinion_ratings
end
class OpinionRating < ActiveRecord::Base
belongs_to :opinion
belongs_to :profile
end
Es ist wichtig, dass Ihr Datenbankschema den richtigen Namenskonventionen folgt, da sonst alles kaputt geht. Stellen Sie sicher, dass Sie Ihre Tabellen mit Datenbankmigrationen erstellen anstatt sie manuell auszuführen.
Diese Zuordnungen erstellen Helfer für Ihre Modelle, um die Suche erheblich zu vereinfachen. Anstatt eine Liste von OpinionRatings zu iterieren und die Benutzer manuell zu sammeln, können Sie Rails dazu bringen, dies für Sie zu tun, indem Sie Rails 2.3 oder 3.0 verwenden named_scope
oder davon scope
abhängen, ob Sie Rails 2.3 oder 3.0 verwenden. Da Sie nicht angegeben haben, werde ich beide Beispiele geben. Fügen Sie dies Ihrer OpinionRating-Klasse hinzu:
2.3
named_scope :for, lambda {|id|
{
:joins => :opinion,
:conditions => {
:opinion => { :id => id }
}
}
}
named_scope :agreed, :conditions => { :agree => true }
named_scope :with_profiles, :includes => :profile
3.0
scope :agreed, where(:agree => true)
def self.for(id)
joins(:opinion).where(:opinion => { :id => id })
end
In jedem Fall können Sie anrufen for(id)
auf demOpinionRatings
Modell und ihm eine ID übergeben:
2.3
@ratings = OpinionRating.agreed.for(params[:id]).with_profiles
@profiles = @ratings.collect(&:profile)
3.0
@ratings = OpinionRating.agreed.for(params[:id]).includes(:profile)
@profiles = @ratings.collect(&:profile)
Das Ergebnis all dessen ist, dass Sie jetzt leicht paginieren können:
@ratings = @ratings.paginate(:page => params[:page])
Update für Rails 4.x: mehr oder weniger gleich:
scope :agreed, ->{ where agreed: true }
def self.for(id)
joins(:opinion).where(opinion: { id: id })
end
Obwohl ich für neuere Rails Kaminari für die Paginierung bevorzuge :
@ratings = @ratings.page(params[:page])