Ruby on Rails - 为什么我不能使用 ActiveRecord::Base 方法?在哪里使用?

Ruby on Rails - Why can't I use ActiveRecord::Base methods? Where to use?

我一直在尝试在我的应用程序中使用 ActiveRecord::Base 方法,例如 .each 和 .collect,但我一直收到未定义的方法错误!也许我对 Ruby 的了解不深。似乎我不能在我的控制器、方法或视图中使用这些方法?

例如,下面的代码会给我一个未定义的方法'collect':

@articles = Article.collect{|x| x.publisher == 'Bloomberg'}

另外一个例子也会报错:

array = []
@articles = Article.each do |x|
   if x.publisher == 'Bloomberg'
      array << x
   end
end

我无法在我的控制器、模型或视图中使用这些方法。我可以在哪里使用它们?谁能告诉我我的 Ruby/Rails 基本代码是否有误?

我正在使用 Rails 4.20 和 Ruby 2.1.5p273

您可能应该使用示波器。这是一个很好的起点:http://guides.rubyonrails.org/active_record_querying.html#scopes

如果您不想这样做,那么您可以在您的控制器中执行以下操作:

@articles = Article.where(publisher: 'Bloomberg')

.each.collectEnumerable mixin in Ruby 中定义的集合方法,而不是 ActiveRecord::Base.

中定义的方法

为了调用 .each.collect,您需要一个响应这些方法调用的集合对象。所以使用:

@articles = Article.all.collect{|x| x.publisher == 'Bloomberg'}

并且,

array = []
@articles = Article.all.each do |x|
   if x.publisher == 'Bloomberg'
      array << x
   end
end

要评论在哪里可以使用它们,您可以在模型或控制器中使用它们,但不能在视图中使用。我建议将此代码放在 class 方法中,甚至放在 Article 模型中的范围中。示例:

# app/models/article.rb

# Class method example:
# Usage: Article.by_publisher('Bloomberg')
def self.by_publisher(publisher_name)
  where(publisher: publisher_name)
end

# Scope example
# Usage: Article.by_publisher('Bloomberg')
scope :by_publisher, ->(publisher_name) { where(publisher: publisher_name) }

然后在您的控制器或视图中使用类似于以下块的 eachcollect

Article.by_publisher('Bloomberg').each do |article|
  # article.title
end

收集方法,每个方法都在 Enumerable 上定义。您需要先获取文章集才能使用它们。只需调用 Article 即可获得 Article 模型 class,您需要改用 Article.all。

@articles = Article.all.collect{|x| x.publisher == 'Bloomberg'}

但是您可能希望在数据库级别执行此操作。将所有文章加载到内存中并过滤掉它们并不是一个好主意,您的数据库可以更快地为您完成这项工作。试试下面的代码。

@articles = Article.where(publisher: 'Bloomberg')