0

構文的に機能させる方法がわかりませんでした。ただし、次のように動作するようになりました。

  scope :out_of_stock, lambda{ |company| get_inventory(company, 'out_of_stock') }
  scope :in_stock, lambda{ |company| get_inventory(company, 'in_stock') }


  def self.get_inventory(company, stock_status)
    StockInventory.find_all_by_....
  end

ただし、匿名関数なしでそれを行う方法はありますか?

4

1 に答える 1

1

まず、Ruby には静的関数がありません。これself.get_inventoryはクラス メソッドであり、実際にはCompanyクラスのシングルトン インスタンス メソッドです。呼び出し自体は、scope他のクラス メソッド (この場合はout_of_stockと) を動的に定義するクラス メソッドin_stockです。

第二に、メソッド全体が含まれていないため、何をしようとしているのかわかりにくいですStockInventoryが、特定の会社 ID と在庫ステータスを持つ のインスタンスを取得しようとしていると仮定します。

ActiveRecord では、ここで行ったように finders を使用できます。または通常はチェーン可能であり、実行が絶対に必要になるまで遅延されるため、もう少し柔軟な関係を使用できます。データベースにアクセスせずにメソッド。既知の ID を持つ単一のオブジェクトを検索する場合を除き、通常はこの理由からリレーションに固執します。

あなたの質問は特に明確ではないので、いくつかの仮定を立てます。と の間CompanyStockInventory( と のようなhas_many :stock_inventories)関係を定義した場合belongs_to :company、その関係を出発点として使用し、StockInventoryクラスで次のようなメソッドを定義できます。

def self.in_stock
  where(stock_status: "in stock") # or whatever
end

最終的に別のクラスをロードするクラス メソッドCompanyにインスタンスを引数として渡すのではなく(これは危険信号である必要があります)、クラスまたは任意のリレーションでこれを直接呼び出すことに注意してください。さらに、これはリレーションであるため、他の ActiveRecord メソッドをチェーンすることができます。CompanyStockInventoryStockInventorymy_company.stock_inventories.in_stock.limit(10)

特定のデータベースの列とステータスに合わせてこのメソッドを変更する必要がありますが、これは非常に複雑です。

いずれにせよ、Active Record Query Interfaceガイドを読むことをお勧めします。仕組みを理解すれば、できることがたくさんあります。

于 2013-03-23T04:36:14.073 に答える