型号:
class Tweet < ActiveRecord::Base
has_one :location, dependent: :destroy
end
class Location < ActiveRecord::Base
belongs_to :tweet
end
控制器:
class TweetsController < ApplicationController
def index
@tweets = Tweet.recent.includes(:location)
end
end
为什么我们在ruby中使用符号(:location
)作为参数?
为什么这不起作用?
@tweets = Tweet.recent.includes(location)
答案 0 :(得分:1)
因为你传递的是一个活跃记录将用于构建sql查询的字符串。没有冒号的位置将是局部变量。我们可以传递一个类(Location),但是对于ActiveRecord来说,符号更有效。符号是一个不可变的字符串,本质上是一种指向字符串的指针,因此非常有效。
答案 1 :(得分:0)
将哈希作为参数传递给方法是很常见的,因为那样你就不必担心参数的排序了。此外,经常用于可选参数。请考虑以下示例:
def method_with_args(name, age, dollar_amount, occupation) # gets sort of ugly and error prone
# do something with args
end
def method_with_hash(hash = {}) # cleans up ordering and forces you to 'name' variables
name = hash[:name]
age = hash[:age]
dollar_amount = hash[:dollar_amount]
occupation = hash[:occupation]
# do stuff with variables
end
问题的第二部分:
@tweets = Tweet.recent.includes(location)
此处的位置应该被定义为调用该方法的对象上的变量或方法。如果您运行代码,错误将提示您输入该信息。
在散列访问和性能方面:对散列的符号访问速度提高约2倍。字符串访问在每次实例化时都会为内存分配一个字符串,从而创建大量垃圾对象。请看看blog post