- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我目前正忙于学习 Ruby 和 Rails,并且由于我有基于 C 语言的背景,Ruby 的一些概念是新的并且有些陌生。对我来说特别具有挑战性的是适应处理常见问题的“Ruby 方式”,因此我经常发现自己用 Ruby 编写 C 代码,这不是我想要实现的目标。
想象一下有这样一个模式:
ActiveRecord::Schema.define(:version => 20111119180638) do
create_table "bikes", :force => true do |t|
t.string "Brand"
t.string "model"
t.text "description"
kết thúc
kết thúc
数据库已经包含了几辆不同的自行车。我的目标是获取数据库中代表的所有品牌的数组。
Đây là mã của tôi:
class Bike < ActiveRecord::Base
def Bike.collect_brands
temp_brands = Bike.find_by_sql("select distinct brand from bikes")
brands = Array.new
temp_brands.each do |item|
brands.push(item.brand)
kết thúc
brands
kết thúc
kết thúc
Ruby 大师会如何编写代码来实现这一目标?
câu trả lời hay nhất
tl;dr:您的整个方法可以替换为 Bike.uniq.pluck(:brand)
。
此功能已经存在(请参阅我的回答的末尾),但首先,让我们单步执行您的代码并使其更加地道:
首先,也是最重要的,每一级缩进使用两个空格,而不是四个、八个,KHÔNG制表符。使用两个空格。这不是个人喜好,这是 Ruby 社区内非常的约定,如果您打算参与,这几乎是必需的。
接下来,几乎从来没有有充分的理由在 Ruby 中使用这种模式:
brands = Array.new
temp_brands.each do |item|
brands.push(item.brand)
kết thúc
当您想通过对输入数组中的每个值应用一些代码将一个数组转换为另一个数组(实际上,一个 Enumerable 转换为另一个 Enumerable)时,请使用 bản đồ
hoặc collect
(这是同义词):
brands = temp_brands.map { |item| item.brand }
接下来可以利用symbol#to_proc
使上面的代码更清楚一点:
brands = temp_brands.map &:brand
对于外行来说这看起来很奇怪,但是一旦您习惯了使用 bản đồ
Và &:field
,它就会更清楚。稍微有点经验就会明白这行代码的意图很明显:它将 brand
方法应用于数组中的每个元素,它完全等同于前面的 { |item| item.brand
版本。
现在,您的整个方法可以变成一个非常简单的单行代码:
def Bike.collect_brands
Bike.find_by_sql("select distinct brand from bikes").map &:brand
kết thúc
内联 select/distinct SQL 有点难看,特别是因为 ActiveRecord 已经让我们 select specific fieldssử dụng lựa chọn
,并使用 uniq
使结果不同:
def Bike.collect_brands
Bike.select(:brand).uniq.map &:brand
kết thúc
作为最后的迭代,我们可以使用 pluck
thay vì bản đồ
只从我们感兴趣的结果中提取字段。但是,因为 pluck
实际上修改了生成的 SQL 以仅包含被提取的字段,我们可以省略 select(:brand)
部分,我们的代码归结为包含两个链接方法的非常短的单行:
def Bike.collect_brands
Bike.uniq.pluck(:brand)
kết thúc
请注意,顺序很重要,因为 pluck
总是返回一个数组,而不是为附加方法链接准备好的 ActiveRecord 关系。 Bike.pluck(:brand).uniq
将从每条记录中选择品牌(select brand from bikes
)然后,在 Ruby 中,减少数组到唯一项。可能是一项非常昂贵的操作。
就是这样,Bike.uniq.pluck(:brand)
。作为一名 C 程序员,您会发现许多您习惯于使用小循环完成的重复性任务实际上已经通过语言本身或支持库为您解决了。一旦您学会了编写惯用的 Ruby 和 Rails 代码,您sẽ không编写的代码量可能会非常惊人。
关于ruby-on-rails - 用 Ruby 思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13035426/
Dưới đây là một máy chủ Ruby rất đơn giản. require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
Tôi đang sử dụng OS X (sử dụng bash) và chưa quen với unix. Tôi muốn biết liệu tôi có thể sửa đổi một số tệp để có thể chạy chương trình Ruby hay không, tôi không cần "Ruby file.rb" nhưng có thể chạy "Ruby.rb". hợp lý
Tôi đang gặp một số vấn đề khi thay thế chuỗi trong Ruby. Văn bản gốc của tôi: Việc con người làm không bằng việc thú vật làm. Tôi muốn thay thế nó bằng: ==Những gì== con người làm không giống ==những gì== động vật làm.
Tôi muốn làm điều gì đó như thế này từ tập lệnh Ruby trong một vòng lặp: viết một tệp a.rb (thay đổi mỗi lần lặp) hệ thống thực thi (Ruby 'a.rb') a.rb viết một chuỗi có kết quả vào một tệp "results " a.rb đã hoàn thành và
Vấn đề của tôi là cố gắng tạo một máy chủ cục bộ để tôi có thể hiểu ứng dụng đang được nhóm mới của tôi phát triển. Vấn đề của tôi là tôi đang sử dụng Ruby 2.3.3 và Gemfile yêu cầu 2.3.1. Tôi không thể chỉnh sửa Gemfile vì tôi được bảo là
Tôi có tiện ích dòng lệnh được viết bằng Ruby bằng khung GLI. Tôi muốn định cấu hình tiện ích dòng lệnh trong thư mục chính của mình, sử dụng chính Ruby làm DSL để xử lý nó (tương tự như Gemfile hoặc Rakefile). TÔI
Tôi có mã này trong Trình điều khiển ứng dụng Rails của mình: def delete object = model.datamapper_class.first(:sourced_id =>
Tôi đang tìm một trình phân tích cú pháp: thân thiện với việc phân tích cú pháp Ruby, có các quy tắc được thiết kế trang nhã, tạo ra các lỗi phân tích cú pháp thân thiện với người dùng, có nhiều tài liệu hướng dẫn người dùng hơn ví dụ về máy tính, CẬP NHẬT: cho phép bỏ qua khoảng trắng tùy chọn khi viết ngữ pháp. Phân tích cú pháp nhanh không phải là một tính năng quan trọng.
Tôi mới làm quen với Ruby và tôi nghe nói rằng có một cách viết mã "Ruby". Ngoài Ruby on Rails, dự án nào khác đáng học và được công nhận là có thiết kế tốt? Câu trả lời hay nhất Tôm được tạo ra rõ ràng không chỉ là một bản PDF hay
Tôi biết một câu hỏi tương tự đã được hỏi trước đây, nhưng làm cách nào để tạo tệp Ruby có thể chạy trong thiết bị đầu cuối mà không cần nhập "Ruby" ở phía trước? Mục tiêu cuối cùng ở đây là tạo ra một loại bộ công cụ dòng lệnh. Bây giờ, để làm được điều tôi muốn người dùng có thể làm
Ví dụ: hàm băm a là {:name=>'mike',:age=>27,:gender=>'male'} hàm băm b là {:name=>'mike'} Tôi tự hỏi liệu có cách nào tốt hơn để xác định liệu hàm băm b có nằm trong hàm băm hay không và
Tôi là nhà phát triển ASP.NET MVC, người đã quyết định học Ruby và Ruby on Rails. Tôi đã học được một chút và tạo một trang web trên RoR. Phát triển trên ASP.NET MVC, tôi luôn sử dụng kiến trúc ba tầng:
Gần đây tôi thấy Gary Bernhardt trình diễn các phím tắt vim mà anh ấy sử dụng để thực thi mã Ruby trong vim. Phím tắt là: map ,t :w\|:!ruby %. Có vẻ như phương thức này luôn thực thi hệ thống Rub
Trong câu trả lời được chọn cho câu hỏi này về Blue Ruby, Chuck đã nói: Tất cả các triển khai Ruby hiện tại được biên dịch thành
Tôi có một mảng Ruby > list =Request.find_all_by_artist("Metallica").map(&:song) => ["Không có gì khác quan trọng"
Tôi đang gặp rắc rối với việc làm tròn. Tôi có một số float mà tôi muốn làm tròn đến một phần trăm dấu thập phân. Tuy nhiên, tôi chỉ có thể sử dụng .round về cơ bản biến nó thành int, nghĩa là 2.34.round # => 2. Có cái nào không
Tôi đã viết một ứng dụng web nhỏ sử dụng Ruby on Rails, mục đích chính của nó là tải lên, lưu trữ và hiển thị kết quả từ tệp xml (tệp có dung lượng tối đa vài MB). Sau khi chạy nó được khoảng 2 tháng, tôi nhận thấy rằng quy trình lai
Làm cách nào chúng ta có thể chuyển đổi một chuỗi như thế này trong Ruby: To: Latorre Best Answers = "" => "" su
Khi đi qua ruby monk, thỉnh thoảng họ ném vào một đoạn mã từ trường bên trái với cú pháp lạ: def tính toán (xyz) trả về nil trừ khi xyz xyz.map {|a,
Tôi không chắc mình đang làm gì sai, nhưng có vẻ như tôi đang hiểu sai. Vấn đề là, với một chuỗi số được phân tách bằng dấu cách, bạn phải trả về số lớn nhất và nhỏ nhất. LƯU Ý: Tất cả các số đều là Int32 hợp lệ, không cần xác thực chúng. Luôn có ít nhất một số trong chuỗi đầu vào. Chuỗi đầu ra phải
Tôi là một lập trình viên xuất sắc, rất giỏi!