小编mar*_*ion的帖子

如何在1次呼叫中急切加载两级关联?

我有FamilyTree, Node, Comment, & User模特.

这种关系是这样的:

FamilyTree

class FamilyTree < ActiveRecord::Base
  belongs_to :user
  has_many :memberships, dependent: :destroy
  has_many :members, through: :memberships, source: :user, dependent: :destroy
  has_many :nodes, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)

Node

class Node < ActiveRecord::Base
  belongs_to :family_tree
  belongs_to :user
  has_many :comments, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)

Comment

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :node
end
Run Code Online (Sandbox Code Playgroud)

User

class User < ActiveRecord::Base
  has_one :family_tree, dependent: :destroy
  has_many :memberships, dependent: :destroy
  has_many :nodes, dependent: :destroy
  has_many :comments
end
Run Code Online (Sandbox Code Playgroud)

Membership ## This is …

ruby-on-rails eager-loading ruby-on-rails-4

0
推荐指数
1
解决办法
1267
查看次数

如果我有一个集合,我如何遍历每个对象并返回一个数组,每个元素是每个对象的一个​​属性?

假设我有一个集合fruits,每个fruit对象都有一个名为的属性color.我想循环遍历我的整个fruits集合,让它以1个单独的数组返回color,每个父节点在数组中是1个元素.

理想情况下,输出看起来像这样:['red', 'blue', 'green', 'yellow'].它不必是字符串,它可以是整数或任何数组中的元素.重要的是每个对象的每个属性都包含在数组的1个单元格中,而我只得到1个数组.

我试过这样的事情:

fruits.map { |fruit| return [fruit.color] }
Run Code Online (Sandbox Code Playgroud)

但是这会返回多个数组 - 这不是我想要的.

想法?

ruby ruby-on-rails ruby-on-rails-4

0
推荐指数
1
解决办法
37
查看次数

为什么 find_each 不返回实际的 AR 对象?

当我尝试只做一个普通的操作时,即使有它应该作用的对象/记录,它find_each也会不断返回。nil

[28] pry(main)> Node.find_each do |node|
[28] pry(main)* end  
  Node Load (1.0ms)  SELECT  "nodes".* FROM "nodes"   ORDER BY "nodes"."id" ASC LIMIT 1000
=> nil
[29] pry(main)> Node.all.find_each do |node|
[29] pry(main)*   node
[29] pry(main)* end  
  Node Load (0.7ms)  SELECT  "nodes".* FROM "nodes"   ORDER BY "nodes"."id" ASC LIMIT 1000
=> nil
[31] pry(main)> Node.count
   (0.5ms)  SELECT COUNT(*) FROM "nodes"
=> 2
[32] pry(main)> Node.find_each do |node|
[32] pry(main)*   puts node
[32] pry(main)* end  
  Node Load (0.5ms)  SELECT  "nodes".* …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-on-rails-4

0
推荐指数
1
解决办法
365
查看次数

如何检查数组数组是否在内部数组中有值?

假设我有一个如下所示的数组:

[[1830, 1], [1859, 1]]
Run Code Online (Sandbox Code Playgroud)

我想要做的是快速扫描内部数组,看看它们中是否包含数字1830.如果是这样,我希望它返回包含数字的整个数组1830,也就是[1830, 1]上面的例子.

我知道一个正常的值数组,我会这样做array.include? 1830,但这在这里不起作用,如下所示:

@add_lines_num_start
#=> [[1830, 1], [1859, 1]]
@add_lines_num_start.include? 1830
#=> false
@add_lines_num_start.first.include? 1830
#=> true
Run Code Online (Sandbox Code Playgroud)

我怎么做?

ruby arrays

0
推荐指数
1
解决办法
41
查看次数

如何在不保存的情况下更新尚未保存的对象?

所以我这样做:

@portfolio = current_user.portfolio
@port_stock = PortStock.new(port_stock_params)
stock = Stock.find(port_stock_params[:stock_id])
@port_stock.update!(current_price: stock.price)

respond_to do |format|
  if @port_stock.save
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我打电话时.update!,@port_stock它实际上会在@port_stock.save以后保存记录.

所以我的回调正在执行两次,这会弄乱我的数据库中的东西.

那么在我明确地调用它之前如何new@port_stock.current_price不实际保存@port_stock对象的情况下更新实例呢?

谢谢.

ruby ruby-on-rails ruby-on-rails-5

0
推荐指数
2
解决办法
77
查看次数

如何在 1 次调用中在 Rails 中查找和更新或创建对象?

所以我试过这个:

stock = Stock.find_or_create_by(ticker: ticker, jse_link: link, name: name, price: price)
Run Code Online (Sandbox Code Playgroud)

事实证明,如果 ActiveRecord 找不到Stock匹配所有 4 个属性的对象,它会创建一个新对象。因此,如果它找到与 4 个属性中的 3 个匹配的对象,则会创建一个重复的属性。

有没有一种简单的方法,而不必使用if语句在 1 次调用中完成所有这些操作?

即我想做的是:

  • 找到Stock匹配的对象ticker: ticker
  • 如果该Stock对象存在,那么我想更新price: price.
  • 如果该Stock对象不存在,那么我想创建一个具有这 4 个属性 ( ticker: ticker, jse_link: link, name: name, price: price)的新对象。

我可以在不使用条件语句的情况下执行上述操作吗?

ruby ruby-on-rails ruby-on-rails-5

0
推荐指数
2
解决办法
2330
查看次数

如何在Rails中的多个对象之间求和两个值的乘积?

想象一下,我有一个p有2股票的投资组合port_stocks.我想要做的是对每个进行计算port_stock,然后总结所有结果.

[60] pry(main)> p.port_stocks
=> [#<PortStock:0x00007fd520e064e0
  id: 17,
  portfolio_id: 1,
  stock_id: 385,
  volume: 2000,
  purchase_price: 5.9,
  total_spend: 11800.0>,
 #<PortStock:0x00007fd52045be68
  id: 18,
  portfolio_id: 1,
  stock_id: 348,
  volume: 1000,
  purchase_price: 9.0,
  total_spend: 9000.0>]
[61] pry(main)> 
Run Code Online (Sandbox Code Playgroud)

所以,从本质上讲,使用上面的代码我想这样做:

ps = p.port_stocks.first #(`id=17`)
first = ps.volume * ps.purchase_price # 2000 * 5.9 = 11,800

ps = p.port_stocks.second #(`id=18`)
second = ps.volume * ps.purchase_price # 1000 * 9.0 = 9,000

first + second = 19,800
Run Code Online (Sandbox Code Playgroud)

我想简单地说19,800.理想情况下,我想以非常Ruby的方式做到这一点.

如果我只是简单地总结1中的所有值total_spend …

ruby ruby-on-rails ruby-on-rails-5

0
推荐指数
1
解决办法
155
查看次数

给定这个数组数组,我如何计算包含重复元素的数组的数量?

我有一个看起来像这样的数组:

[[["Sports", "Soccer"], 2], [["eSports"], 1], [["Sports", "Soccer"], 3]]
Run Code Online (Sandbox Code Playgroud)

在最外层数组的任何元素中,第一个元素(数组)是类别列表。第二个元素是program.id这个类别数组来自。

因此,取上述数组中的第一个元素 -["Sports", "Soccer"]是 的类别数组program_id: 2

如何计算类别数组重复的实例?在上述情况下,我想要的是这样的:

["Sports", "Soccer"] => Occurs 2 times, with Program Ids: 2 & 3
["eSports"] => Occurs 1 time, with Program Id: 1
Run Code Online (Sandbox Code Playgroud)

我如何有效地做到这一点?

ruby arrays ruby-on-rails ruby-on-rails-6

0
推荐指数
1
解决办法
65
查看次数

如何处理我正在排序的数组中的nil元素?

我正在调用sort这样的数组:

new_list = my_array.sort
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

NoMethodError: undefined method `<=>' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

如何处理这种简单排序的无案例?

我最初有一个破坏性排序调用(即sort!)并将其更改为常规sort,但它仍然会抛出此错误.

思考?

ruby

-1
推荐指数
1
解决办法
351
查看次数

如何迭代此JSON对象?

这是一个response在HTTP POST请求中返回的对象:

res.body
=> "{\"id\":\"a3adasfaf3\",\"url\":\"https://someurl/a3adasfaf3\",\"created\":\"2016-05-30T07:00:58Z\",\"modified\":\"2016-05-30T07:00:58Z\",\"files_hash\":\"cljhlk2j3l2kj34hlke18\",\"language\":\"ruby\",\"title\":\"Some weird hello world message\",\"public\":false,\"owner\":\"kljhlk2jh34lk2jh4l2kj3h4l2kj4h23l4kjh2l4k\",\"files\":[{\"name\":\"Some-weird-hello-world-message.rb\",\"content\":\"puts \\\"Some weird hello world message.\\\"\\r\\n\"}]}"
Run Code Online (Sandbox Code Playgroud)

我试图退出,并翻译它的各种属性response.例如,至少idurl.

我该怎么做呢?

为了记录,我使用Ruby的NET/HTTP std lib发送POST请求并获取此响应.

编辑1

对于奖励积分,我想要的只是存储在每个属性中的实际值(即实际值id(只是一个字符串)和一个url(这是一个典型的URL).所以,如果你包括我如何访问该属性然后消毒它同时会很棒.

ruby json ruby-on-rails

-1
推荐指数
1
解决办法
1000
查看次数

为什么这个数组元素有数据时会返回nil?

我正在解析 CSV 中的行,这是每个行对象外观的示例:

 pry(Program)> row
=> #<CSV::Row "?Broadcast Name":"2020 FC Cincinnati vs Toronto FC | MLS" "Description":"Major League Soccer is a men's professional soccer league sanctioned by the United States Soccer Federation which represents the sport's highest level in the United States. The league comprises 26 teams—23 in the U.S. and 3 in Canada and constitutes one of the major professional sports leagues in both countries." "Category":"Sports,Soccer" "Sizzle Reel":"https://youtu.be/fM5aHIVBTIc" "Thumbnail Image":"Screen Shot 2020-01-14 at 5.27.31 PM.png (https://dl.airtable.com/.attachments/7d9273fef3fc1cf1a44c4f2c4db395e7/05f3cd4a/ScreenShot2020-01-14at5.27.31PM.png)" "Header Image":"Screen Shot …
Run Code Online (Sandbox Code Playgroud)

ruby csv ruby-on-rails ruby-on-rails-6

-1
推荐指数
1
解决办法
60
查看次数

Ruby:名为AFTER定义的方法上的未定义方法错误

我不确定这里发生了什么......但是我说这样做:

def who_wins?(choice1, choice2)
    if (choice1 == 'R' && choice2 == 'S') || (choice1 == 'S' && choice2 == 'P') || (choice1 == 'P' && choice2 == 'R')
        return choice1
    elsif choice1 == choice2
        return "tie"
    else
        raise NoSuchStrategyError
    end
end

won_wins?('R', 'P')
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

NoMethodError: undefined method `won_wins?' for main:Object

at top level    in my-file.rb at line 25
Run Code Online (Sandbox Code Playgroud)

为什么它会这样做,即使我在定义之后调用方法?

ruby

-2
推荐指数
1
解决办法
422
查看次数