我有三个模型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值的内容。
答案 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
获取更多信息
答案 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
我会给你一些背景信息(希望它将来能帮助你)。
首先,您必须了解Rails是建立在关系数据库之上 - 或者至少它应该是。关系数据库使用foreign_keys
来访问关联数据对象:
虽然这似乎并不重要,但它解释了ActiveRecord系统的整个功能。
ActiveRecord就是所谓的 ORM (对象关系映射器)......简而言之,您可以使用关系数据库中的关联数据填充对象。
对于Ruby / Rails,ActiveRecord的对象定向性质是Ruby的直接结果。也就是说,Ruby是一种面向对象的语言;你在其中所做的一切都围绕着对象:
使用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
之类的内容并填充正确的数据。
以下是一个很好的演示:
答案 2 :(得分:0)
我分享了如何使用ActiveRecord::Relation
运行查询。要了解查询,无论您想要显示远离当前表的数据,但是当这些数据具有关联时,都可以连接这些数据。
逐步进行查询:
在这里,您必须确定与其表关联相关的表。在这种情况下:用户,电路板和应用程序。
你可以把current_user作为一个条件。您需要用户,电路板,应用程序
所以条件是:
User.joins(boards: :applications).where("users.id = ?", current_user.id)
注意:强>
我会尝试解释。用户加入了主板,因为用户有很多主板。下一个板有很多应用,所以我们必须将应用板加入boards: :applications
。
这是很好的解释,查询有很多通过关联。 activerecord-query-through-multiple-joins