Ruby on rails - 访问另一个模型中的模型数据

时间:2014-08-05 08:22:06

标签: ruby-on-rails rails-models

我想访问从OtherModel.rb到MyModel.rb的列。这可能吗?

如果我想要访问的数据位于模型本身内,这就是它的样子。这很好用

//MyModel.rb

def to_param
  self.name
end

但我不知道如何从其他模型访问数据。 这是我想要的一个例子:

//MyModel.rb

def to_param
  OtherModel.name
end

2 个答案:

答案 0 :(得分:11)

模型 - ception !!


<强>物件

描述您遇到的问题的最佳方式是概述Ruby(由于构建在Ruby语言之上而构建的&Rails)是object-orientated

与流行的看法相反,面向对象不仅仅是一个流行语 - 它意味着应用程序的每个元素都应该围绕对象构建。对象本质上是&#34;变量&#34;其中包含一系列属性和附加的其他数据:

enter image description here

在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