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
和 .collect
是 Enumerable 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) }
然后在您的控制器或视图中使用类似于以下块的 each
或 collect
:
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')
我一直在尝试在我的应用程序中使用 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
和 .collect
是 Enumerable 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) }
然后在您的控制器或视图中使用类似于以下块的 each
或 collect
:
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')