1

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

例如,下面的代码会给我一个未定义的方法“收集”:

@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

4

3 回答 3

2

.each并且是 Ruby 中Enumerable mixin 中.collect定义的集合方法,而不是.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

要评论可以在哪里使用它们,您可以在模型或控制器中使用它们,而不是在视图中使用它们。我建议将此代码放置在您的文章模型中的类方法甚至范围中。例子:

# 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
于 2015-02-27T16:36:16.023 回答
1

方法 collect 和 each 都在Enumerable上定义。您需要先获取一系列文章才能使用它们。只需调用 Article 即可获得 Article 模型类,您需要使用 Article.all 代替。

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

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

@articles = Article.where(publisher: 'Bloomberg')
于 2015-02-27T16:54:50.193 回答
0

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

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

@articles = Article.where(publisher: 'Bloomberg')
于 2015-02-27T16:34:56.383 回答