我想访问从OtherModel.rb到MyModel.rb的列。这可能吗?
如果我想要访问的数据位于模型本身内,这就是它的样子。这很好用
//MyModel.rb
def to_param
self.name
end
但我不知道如何从其他模型访问数据。 这是我想要的一个例子:
//MyModel.rb
def to_param
OtherModel.name
end
答案 0 :(得分:11)
模型 - ception !!
<强>物件强>
描述您遇到的问题的最佳方式是概述Ruby(由于构建在Ruby语言之上而构建的&Rails)是object-orientated。
与流行的看法相反,面向对象不仅仅是一个流行语 - 它意味着应用程序的每个元素都应该围绕对象构建。对象本质上是&#34;变量&#34;其中包含一系列属性和附加的其他数据:
在Rails中,对象被创建为模型(类)的实例
<强>修正强>
当您拨打OtherModel.name
时,您未初始化相关课程的实例,因此意味着您将无法显示任何属性它有
为确保可以解决此问题,您需要确保加载OtherModel
对象的实例,以确保您能够调用相关数据:< / p>
#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关联如何创建关联模型的实例?这允许您从&#34; parent&#34;的实例中调用它。模型,而无需重新初始化
-
<强>代表强>
您也可以使用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
关系一起使用
答案 1 :(得分:1)
OtherModel.new将创建一个OtherModel的新实例。
或者您可以使用OtherModel.all.first作为OtherModel的第一个记录。根据上下文,我们可以通过任何实例访问名称列
提供的名称是OtherModel
列的名称<强> MyModel.rb 强>
def to_param
OtherModel.new.name
OtherModel.all.first.name
end