Rails find_all模型方法

时间:2017-12-30 00:21:09

标签: ruby-on-rails

我对Rails有些新手,在以前的小应用程序中,我会把控制器弄得乱七八糟。我试图更有效地使用模型,并且无法真正找到一个学习模型函数等的好地方。

我在这里有这个模型,我想找到if (isFirstTime) MainPivot.SelectedItem = SettingsPivotItem; Maps,所以我创建了这个find_maps方法。

has_many

在我的class Subaccount < ApplicationRecord belongs_to :account has_many :users has_many :maps enum state: { active: 0, inactive: 1 } def find_maps Map.where(subaccount_id: self.id).all end end 中,我使用这样的方法在变量中调用它。

subaccounts_controller

现在,如果我跳转到该控制器的show视图并使用此代码。

class SubaccountsController < ApplicationController
  def show
    @submaps = Subaccount.find_maps
  end
end

然后我收到了这个错误。

<% @submaps.each do |sm| %>
  <%= sm %>
<% end %>

如果我在sub_account模型下调用它,为什么我会得到这个未定义的方法find_maps?我想确保在整个过程中采用最佳实践。请问有人帮帮我吗?

2 个答案:

答案 0 :(得分:0)

因为以你的方式定义,这样

def find_maps
  Map.where(subaccount_id: self.id).all
end

您必须在subaccount实例上调用它。 E.g。

  • Subaccount.first.find_maps
  • Subaccount.new.find_maps
  • Subaccount.find(some_id).find_maps

如果要在Subaccount类上调用它,请将其定义为

def self.find_maps
  Map.where(subaccount_id: self.id)
end

我删除了那里没用的.all。您想要所有地图或指定where子句。两者同时没有意义。

答案 1 :(得分:0)

当您致电Cookies时,您的find_maps方法实际上会复制ActiveRecord为您添加的方法。

在您的控制器显示方法中,您应该查找当前显示的子帐户并在其上调用地图:

has_many :maps