как написать этот запрос базы многие-ко-многим в рельсах - PullRequest
0 голосов
/ 06 декабря 2010

Эй, ребята Я новичок в рельсах, у меня много откровений, и я пишу какой-то код, и он кажется неэффективным, я вставляю свой код ниже, не могли бы вы помочь мне найти лучший способ написать это.

Таблица видео:

class CreateVideos < ActiveRecord::Migration
  def self.up
    create_table :videos do |t|
      t.string :title
      t.string :desc
      t.string :tudou
      t.string :otherurl

      t.timestamps
    end
  end

  def self.down
    drop_table :videos
  end
end

Стол барабанщиков:

class CreateDrummers < ActiveRecord::Migration
  def self.up
    create_table :drummers do |t|
      t.string :first_name
      t.string :middle_name
      t.string :last_name
      t.string :nick_name
      t.boolean :gender

      t.timestamps
    end
  end

  def self.down
    drop_table :drummers
  end
end

и я установил их в простую ассоциацию «многие ко многим»

class CreateDrummersVideosJoin < ActiveRecord::Migration
  def self.up
    create_table :drummers_videos, :id => false do |t|
    t.integer "drummer_id" 
    t.integer "video_id"
    end
  end


  def self.down
    drop_table :drummers_videos
  end
end

Я хочу найти все название барабанщика. Имя зовется "Jojo", фамилия видео "Mayer"

мой код:

title = Drummer.where(:first_name => "Jojo", :last_name => "Mayer").first.videos.each {|t| t.title}

Это возвращает все данные столбца, а не только название, которое я хочу

и так как есть только один возвращаемый результат с именем "Jojo Mayer", но возвращаемое значение - activeRelation, я не могу вызывать видео, поэтому мой обходной путь использует: сначала получить экземпляр видео, чтобы вызвать видео , Я знаю, что это определенно не так

есть предложения?

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Прежде всего, если вы хотите получить только атрибут заголовка из видео, вы должны использовать карту или собирать вместо каждого, так что-то вроде этого:

Drummer.where(...).first.videos.map{ |t| t.title }

или даже короче:

.map(&:title)

Во-вторых, мне кажется, что если вы действительно хотите получить все видео от одного объекта Drummer, то использование первого, так или иначе, как вы делаете, является довольно хорошим вариантом.

В противном случае, если вы хотите получить все видео от разных барабанщиков в соответствии с определенными критериями, вам, вероятно, следует позвонить в Video напрямую, а затем присоединиться или включить барабанщика. Возможно так:

Video.joins(:drummers).where("drummers.first_name = 'jojo' AND drummers.last_name = 'Mayer'").map(&:title)
1 голос
/ 06 декабря 2010

Вам нужна таблица соединений между ними, как вы делаете вывод. Но эту таблицу соединений в Rails не нужно создавать в процессе миграции. Это можно сделать исключительно в моделях.

#drummer.rb
 belongs_to  :drummer_videos, :polymorphic => true
 has_many    :videos, :as => :drummer_videos

#video.rb
 belongs_to :drummer_videos, :polymorphic => true
 has_many :drummers, :as => :drummer_videos

Убедитесь, что drummer TABLE и video TABLE имеют атрибут drummer_videos_id.

Тогда вы можете позвонить своему барабанщику ..

Drummer.where(:first_name => "Jojo", :last_name => "Mayer").videos.each {|t| t.title}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...