如何在Ruby on Rails中加入嵌套的belongs_to

时间:2015-09-29 02:23:47

标签: ruby-on-rails ruby

我有三个模型Application,属于Board,属于User

class User < ActiveRecord::Base
  has_many :boards
end

class Board < ActiveRecord::Base
  belongs_to :user
  has_many :applications
end

class Application < ActiveRecord::Base
  belongs_to :board
end

我总是只想为当前用户展示主板或应用程序。如何说“为当前用户显示当前板的每个应用程序”?基本上如何查询特定父ID值的内容。

3 个答案:

答案 0 :(得分:3)

您应该首先提供当前用户ID和电路板ID。

user = User.find(user_id)           #get current user
board = user.boards.find(board_id)  #get current board
board.applications                  #get every application

您可以从Rails Guide--Active Record Associations

获取更多信息

答案 1 :(得分:2)

  

显示module.exports = function stepResultHooks() { var fs = require('fs'), dir = 'features/screenShots/'; this.StepResult(function (event, callBack) { var stepResult = event.getPayloadItem('stepResult'), step = stepResult.getStep(); if (stepResult.isFailed()) { browser.takeScreenshot().then(function (png) { browser.getCapabilities().then(function (capabilities) { var browserName = capabilities.caps_.browserName; var browserVersion = capabilities.caps_.version; var stream, fname; fname = 'Screenshot' + '_' + 'Failed Step' + '_' + step.getName() + '_' + browserName.toUpperCase()+'_'+browserVersion+'_' + new Date() + '.png'; fname = fname.replace(/"|'|\//g, '').replace(/\s|:|>/g, '_'); stream = fs.createWriteStream(dir + fname); stream.write(new Buffer(png, 'base64')); stream.end(); }); }).then(callBack); } else callBack(); });

当前电路板的每个应用

ActiveRecord的强大功能应该让这个变得相对简单:

current_user

这假设您使用board = current_user.boards.find params[:board_id] board.applications #-> collection of Application objects for board ,因此可以访问devise方法。

如果没有,您将能够使用以下内容:

current_user

ORM

我会给你一些背景信息(希望它将来能帮助你)。

首先,您必须了解Rails是建立在关系数据库之上 - 或者至少它应该是。关系数据库使用foreign_keys来访问关联数据对象:

enter image description here

虽然这似乎并不重要,但它解释了ActiveRecord系统的整个功能。

ActiveRecord就是所谓的 ORM (对象关系映射器)......简而言之,您可以使用关系数据库中的关联数据填充对象

对于Ruby / Rails,ActiveRecord的对象定向性质是Ruby的直接结果。也就是说,Ruby是一种面向对象的语言;你在其中所做的一切都围绕着对象:

enter image description here

使用Rails,这些对象构建在模型中。

因此,如果您想了解Rails如何工作 - 您真的需要深入到模型级别 - 您必须了解调用#config/routes.rb resources :users do resources :applications #-> url.com/users/:user_id/applications end #app/controllers/applications_controller.rb class ApplicationsController < ApplicationController def index @user = User.find params[:user_id] @boards = @user.boards end end #app/views/applications/index.html.erb <% @user.boards.each do |board| %> <%= board.name %> <% board.applications.each do |application| %> <%= application.name %> <% end %> <% end %> <% end %> 构建< / em>该模型周围的对象,用数据库中的数据填充它。

非常聪明。

associations由ActiveRecord提供,并通过关系数据库基础结构提取。这意味着您可以调用Model.find x之类的内容并填充正确的数据。

以下是一个很好的演示:

enter image description here

答案 2 :(得分:0)

我分享了如何使用ActiveRecord::Relation运行查询。要了解查询,无论您想要显示远离当前表的数据,但是当这些数据具有关联时,都可以连接这些数据。

逐步进行查询:

  1. 确定所有关系表
  2. 在这里,您必须确定与其表关联相关的表。在这种情况下:用户,电路板和应用程序。

    1. 确定条件
    2. 你可以把current_user作为一个条件。您需要用户,电路板,应用程序

      所以条件是:

      User.joins(boards: :applications).where("users.id = ?", current_user.id)
      

      注意:

      我会尝试解释。用户加入了主板,因为用户有很多主板。下一个板有很多应用,所以我们必须将应用板加入boards: :applications

      这是很好的解释,查询有很多通过关联。 activerecord-query-through-multiple-joins