我有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 …
假设我有一个集合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)
但是这会返回多个数组 - 这不是我想要的.
想法?
当我尝试只做一个普通的操作时,即使有它应该作用的对象/记录,它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) 假设我有一个如下所示的数组:
[[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)
我怎么做?
所以我这样做:
@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对象的情况下更新实例呢?
谢谢.
所以我试过这个:
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)的新对象。我可以在不使用条件语句的情况下执行上述操作吗?
想象一下,我有一个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 …
我有一个看起来像这样的数组:
[[["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)
我如何有效地做到这一点?
我正在调用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,但它仍然会抛出此错误.
思考?
这是一个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.例如,至少id和url.
我该怎么做呢?
为了记录,我使用Ruby的NET/HTTP std lib发送POST请求并获取此响应.
编辑1
对于奖励积分,我想要的只是存储在每个属性中的实际值(即实际值id(只是一个字符串)和一个url(这是一个典型的URL).所以,如果你包括我如何访问该属性然后消毒它同时会很棒.
我正在解析 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) 我不确定这里发生了什么......但是我说这样做:
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)
为什么它会这样做,即使我在定义之后调用方法?