模型感知!!
对象
描述您遇到的问题的最佳方式是概述 Ruby(以及基于 Ruby 语言构建的 Rails)是object-orientated。
与流行的看法相反,面向对象不仅仅是一个流行词——它意味着你的应用程序的每个元素都应该围绕对象构建。对象本质上是“变量”,其中包含一组属性和附加到它们的其他数据:
在 Rails 中,对象被创建为模型(类)的实例
修复
当您调用OtherModel.name 时,您并未初始化相关类的实例,因此意味着您将无法显示它所具有的任何属性
为确保可以解决此问题,您需要确保加载OtherModel 对象的实例,以确保您能够调用相关数据:
#app/models/my_model.rb
Class MyModel < ActiveRecord::Base
def to_param
return OtherModel.first.name #-> returns first instance of `OtherModel` & then displays "name"
end
end
协会
更好的选择是利用ActiveRecord Associations:
#app/models/my_model.rb
Class MyModel < ActiveRecord::Base
has_many :other_models
end
#app/models/other_model.rb
Class OtherModel < ActiveRecord::Base
belongs_to :my_model
end
这意味着您可以调用以下命令:
@my_model = MyModel.find 1
@my_model.other_models.each do |other|
puts other.name
end
查看 ActiveRecord 关联如何创建关联模型的实例?这允许您从“父”模型的实例中调用它,而无需重新初始化它
--
委托
您也可以使用delegate 方法,具体取决于您的关联设置:
#app/models/my_model.rb
Class MyModel < ActiveRecord::Base
belongs_to :other_model
delegate :name, to: :other_model, prefix: true
end
#app/models/other_model.rb
Class OtherModel < ActiveRecord::Base
has_many :my_models
end
这将允许您调用:
@my_model = MyModel.find 1
@my_model.other_model_name
必须注意delegate 方法仅适用于belongs_to 关系