【问题标题】:Select record from table (and some conditions)从表中选择记录(和一些条件)
【发布时间】:2014-09-13 18:47:28
【问题描述】:

我不想使用纯 sql 查询,但我无法处理 Active Records 方法。

我有这样的模型:

class Car < ActiveRecord::Base
  has_many :reviews
end

class Review < AcriveRecord::Base
  belongs_to :cars
end

现在我想获取特定汽车的所有评论。您知道我想从 car_id 相同的评论中选择所有记录(仅针对特定汽车的所有评论)。

我正在尝试使用http://guides.rubyonrails.org/active_record_querying.html,但它仍然不起作用。

【问题讨论】:

  • 所以只需在汽车对象上调用reviews,例如@car.reviews
  • 你应该小心 Ruby on Rails 中对象的复数形式。阅读它,看看它在英语中是否有意义。这是不寻常但更容易阅读的东西。
  • 关于复数的注意事项:特别是 belongs_to :car 而不是 belongs_to :cars

标签: sql ruby-on-rails ruby activerecord


【解决方案1】:

您将能够通过以下方式获得汽车的所有评论:

@car.reviews

将您的 review.rb 模型更新为:

class Review < AcriveRecord::Base
  belongs_to :car # SINGULAR !
end

它将使您能够以以下方式获取 car 以获取 review

@review.car

【讨论】:

  • 当我在 Car model 中写 @car.reviews 时,我从 RSpec undefined method 'reviews' for nil:NilClass 得到。为什么?
  • @car 是一个变量,你需要给它赋值:@car = Car.find(&lt;car_id&gt;) 然后你可以找到那辆车的reviews@car.review
【解决方案2】:

只要找到你想要的汽车对象,比如这样的

@car = Car.find(id: params[id])

然后所有关联都可以通过它们的名称轻松访问,而无需进行查询

@reviews = @car.reviews

【讨论】:

  • 谢谢,这真的很有帮助。如果我在表 REVIEWS 列 RATING 中有我想获得特定汽车的所有评级? (评级是评论表中的列,我想要例如将它们相加)
  • 您可以使用@car.reviews.count 来获取总评论数,或者使用@car.reviews.average(:rating) 来获取该对象的平均评分,@car.reviews.sum(:whatever) 也可以使用
【解决方案3】:

这很简单。首先获取汽车的活动记录,例如 id 存储在变量 car_id 中

@car = Car.find(car_id)
@car.reviews #This will get you the reviews

为了避免多次数据库调用,你可以使用包含

@car = Car.includes(:reviews).find(car_id) 

如果你只是想要评论,那么

@reviews = Review.where(:car_id=>car_id) #provided car_id is the foreign key here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多