ρουμπίνι επί σιδηροτροχιών διήθηση pg_search_scope V2.2

ψήφοι
46

Είμαι πολύ νέα για να Ruby on Rails και χρειάζομαι βοήθεια αναφέρονται για το πώς να τροποποιήσει ένα υπάρχον ερώτημα db. Είμαι χρησιμοποιώντας παλιές εκδόσεις, οι οποίες δεν μπορώ να ενημερώσετε: Ruby 2.2.3p173, και Ράγες 4.0.2.

Θέλω να φιλτράρετε τα υπάρχοντα αποτελέσματα του ερωτήματος για να αφαιρέσετε αρχεία που δεν έχουν κανένα βίντεο. Το μοντέλο ιεραρχίας νομίζω ότι είναι: Καλλιτέχνης, AlbumGroup, Album, Track, βίντεο.

Για να διευκρινίσει: Θέλω καλλιτέχνες με τουλάχιστον 1 βίντεο, από το μοντέλο σύνδεσης καλλιτέχνη-> AlbumGroup-> Άλμπουμς-> tracks-> βίντεο (δεν είναι καλλιτέχνης> βίντεο).

Το υπάρχον ερώτημα περιέχεται στο μοντέλο Καλλιτέχνης:

require_dependency tagging
require_dependency similar
class Artist < ActiveRecord::Base
  has_many :images, dependent: :destroy
  has_many :taggings, dependent: :destroy
  has_many :artforms, through: :taggings
  has_many :similars, foreign_key: similar_id, dependent: :destroy
  has_many :similar_artists, through: :similars, source: :similar_to
  has_many :reverse_similars, foreign_key: similar_to_id, class_name: Similar, dependent: :destroy
  has_many :similar_to_artists, through: :reverse_similars, source: :similar
  has_many :memberships, foreign_key: member_id, dependent: :destroy
  has_many :groups, through: :memberships, source: :membership
  has_many :group_members, foreign_key: membership_id, class_name: Membership, dependent: :destroy
  has_many :members, through: :group_members, source: :member
  has_many :users, through: :followed_artists
  has_many :videos, dependent: :destroy
  has_many :audios, dependent: :destroy
  has_many :metrics, through: :audios
  has_many :releases, foreign_key: 'artist_id', class_name: AlbumGroup
  has_many :albums
  has_many :collaborations
  has_many :album_groups, through: :collaborations
  mount_uploader :mugshot, MugshotUploader
  include PgSearch
  pg_search_scope :for_name,
      against: :name,
      using: { tsearch: {threshold: '1', dictionary: 'simple', tsvector_column: 'tsv_name', prefix: true, normalization: 2}},
      ranked_by: (artists.popularity / 50 * :tsearch) + :tsearch
end

Θέλω να προσθέσω κάτι σαν το παρακάτω, για να φιλτράρετε τα αρχεία που δεν έχουν κανένα βίντεο: (στο ερώτημα):

if: artist.releases.albums.tracks.videos.count > 1

Ή το μοντέλο καλλιτέχνης ίσως ?:

scope :valid, -> {where(video_count > 1)}

Ο άλλος κωδικός για τα διάφορα μοντέλα είναι κάτω:

class AlbumGroup < ActiveRecord::Base
  belongs_to :artist
  has_many :collaborations
  has_many :artists, through: :collaborations
  has_many :albums
  has_many :taggings, dependent: :destroy
  has_many :artforms, through: :taggings
  mount_uploader :artwork, MugshotUploader
  def as_json options={}
    {
      id: id,
      title: title
    }
  end
end

class Album < ActiveRecord::Base
  belongs_to :album_group
  belongs_to :artist
  has_many :tracks
end

class Track < ActiveRecord::Base
  has_many :playlist_tracks, dependent: :destroy
  has_many :playlists, through: :playlist_tracks
  belongs_to :audio
  belongs_to :video
  has_many :videos
  has_many :audios
  has_many :taggings, dependent: :destroy
  has_many :artforms, through: :taggings
  belongs_to :album
  belongs_to :artist
  default_scope order: position ASC
  after_save :cache_columns

  def cache_columns
    if image_url.nil?
      img = album.album_group.artwork_url(:tiny)
      unless img.nil?
        update_column(:image_url,img)
      end
    end
    if artist_name.nil?
      if artist_id
        name = Artist.find(artist_id).name
        update_column(:artist_name,name)
      end
    end
    if album_name.nil?
      if album_id
        title = Album.find(album_id).title
        update_column(:album_name,title)
      end
    end
  end
end

class Video < ActiveRecord::Base
  belongs_to :artist
  belongs_to :event
  belongs_to :track
  has_many :tracks
  has_many :playlists, through: :tracks, order: tracks.position ASC
  scope :valid, -> {where(flag_count < 2).order(score DESC) }
  scope :flagged, -> {where(flag_count > ?, 1) }
#   validates :url, uniqueness: {scope: :artist_id}
end
Δημοσιεύθηκε 07/11/2017 στις 14:20
χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

ActiveRecord του has_manyκαι belongs_toοι μέθοδοι σας δίνουν τη δυνατότητα να ορίσετε τα πεδία άμεσα, για τη σύνδεση. Με αυτό τον τρόπο, μπορείτε να προσαρμόσετε την SQL που δημιουργείται κατά την πρόσβαση στην ένωση.

ας υποθέσουμε ότι θέλετε να ορίσετε ένα πεδίο με το μοντέλο του καλλιτέχνη που επιστρέφει όλους τους καλλιτέχνες που έχουν μηδενική βίντεο. Σε Ράγες 5, να βρείτε όλους τους καλλιτέχνες που δεν έχουν βίντεο, που μπορείτε να χρησιμοποιήσετεleft_outer_joins

class Artist < ActiveRecord::Base
  has_many :videos
  scope :with_zero_videos, -> { left_outer_joins(:videos).where(videos: {id: nil}) }
end

Μια άλλη καλή λύση είναι να χρησιμοποιήσετε includesσαν αυτό:

Artist.includes(:videos).where(videos: { videos_id: nil })

Μπορείτε να επιλέξετε αυτό που σας αρέσει περισσότερο!

Ελπίζω να βοήθησε.

Απαντήθηκε 07/11/2017 στις 15:12
πηγή χρήστη

ψήφοι
0

Ευχαριστώ Γαβριήλ, έχω προσθέσει μια πρώτων ερωτημάτων SQL για να artists_controller.rb, η οποία μοιάζει με:

  def index
    #artists = Artist.for_name(params[:name])
    artists = Artist.find_by_sql ["SELECT artists.*, ((artists.popularity / 50 * (ts_rank((artists.tsv_name), (to_tsquery('simple', ''' ' || ? || ' ''' || ':*')), 2))) + (ts_rank((artists.tsv_name), (to_tsquery('simple', ''' ' || ? || ' ''' || ':*')), 2))) AS pg_search_rank FROM artists " +
      "JOIN album_groups on (artists.id = album_groups.artist_id) " +
      "JOIN tracks on (tracks.album_group_id = album_groups.id) " +
      "JOIN videos on (videos.track_id = tracks.id) " +
      "WHERE (((artists.tsv_name) @@ (to_tsquery('simple', ''' ' || ? || ' ''' || ':*')))) " +
      "GROUP BY artists.id " +
      "ORDER BY pg_search_rank DESC, artists.id ASC", params[:name], params[:name], params[:name]]
    render json: artists, each_serializer: SimpleArtistSerializer
  end
Απαντήθηκε 08/11/2017 στις 13:42
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more