Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rails中编写多对多基查询_Ruby On Rails - Fatal编程技术网

Ruby on rails 如何在rails中编写多对多基查询

Ruby on rails 如何在rails中编写多对多基查询,ruby-on-rails,Ruby On Rails,嘿,伙计们 我是rails新手,有很多让我大开眼界的东西,我写了一些代码,但似乎效率不高,我将代码粘贴到下面,你能帮我找到一个更好的方法来写这个吗 视频表: class CreateVideos < ActiveRecord::Migration def self.up create_table :videos do |t| t.string :title t.string :desc t.string :tudou t.stri

嘿,伙计们 我是rails新手,有很多让我大开眼界的东西,我写了一些代码,但似乎效率不高,我将代码粘贴到下面,你能帮我找到一个更好的方法来写这个吗

视频表:

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
这将返回所有列的数据,而不是我想要的唯一标题

由于只有一个名为“Jojo Mayer”的结果返回,但是返回值是activeRelation,所以我不能调用视频,所以我的解决方法是:首先获取视频实例,以便调用视频。我知道这绝对不是做这件事的方式


有什么建议吗

它们之间需要一个联接表,就像您推断的那样。但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表
video表
具有
drummer\u videos\u id
属性

然后你可以打电话给你的鼓手

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

首先,如果您只想从视频中获取title属性,则应使用map或collect而不是each,因此如下所示:

Drummer.where(...).first.videos.map{ |t| t.title }
Video.joins(:drummers).where("drummers.first_name = 'jojo' AND drummers.last_name = 'Mayer'").map(&:title)
甚至更短:

.map(&:title)
其次,在我看来,如果你真的想从一个鼓手对象中获取所有视频,那么像你一样以某种方式使用first是一个不错的选择

否则,如果您想根据特定标准从不同的鼓手那里获取所有视频,那么您可能应该直接调用视频,然后加入或包括鼓手。也许是这样的:

Drummer.where(...).first.videos.map{ |t| t.title }
Video.joins(:drummers).where("drummers.first_name = 'jojo' AND drummers.last_name = 'Mayer'").map(&:title)

丹恩,你很好!你能给我推荐一些Rails教程或其他学习材料吗?谢谢,谢谢!大约一年前,我开始使用RoR,一开始,我只是关注谷歌搜索RubyonRails教程的一百万个结果之一。但随着我的进步,我发现对我来说,最好的想法来自于在这里查看StackOverflow,看看其他人在哪里问了什么以及他们得到了什么答案。太好了,感谢分享你的经验Hey Trip,据我所知,只有两种方法可以处理多对多关系,你的解决方案对我来说似乎是新的,我在哪里可以找到关于这个协会的参考资料,谢谢谢尔是一个伟大的铁路专家
Video.joins(:drummers).where("drummers.first_name = 'jojo' AND drummers.last_name = 'Mayer'").map(&:title)