我正在现有MySQL数据库上构建一个轻量级Web用户界面rails(4.0.0)应用程序作为数据集成场景。我无法将相关值提取到主实体电影。
我通过脚手架生成了所有内容而没有迁移(因为给出了数据库)。这些是我的两个表的定义,应该关联。这些表格具有单一的名称。所以我在config / environments / *文件中使用ActiveRecord::Base.pluralize_table_names = false
。
CREATE TABLE `movie` (
`movie_id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(128) NOT NULL,
`release_day` int(2) DEFAULT NULL,
`release_month` int(2) DEFAULT NULL,
`release_year` int(4) DEFAULT NULL,
`duration` smallint(3) DEFAULT NULL,
`budget` decimal(15,2) DEFAULT NULL,
`revenue` decimal(15,2) DEFAULT NULL,
`description` text,
`ageRestriction` int(11) DEFAULT NULL,
PRIMARY KEY (`movie_id`)
)
CREATE TABLE `rating` (
`movie_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`ratingValue` int(2) DEFAULT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`movie_id`,`user_id`),
KEY `user_id` (`user_id`),
CONSTRAINT `rating_ibfk_1` FOREIGN KEY (`movie_id`) REFERENCES `movie` (`movie_id`),
CONSTRAINT `rating_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
)
模型如下所示。
class Rating < ActiveRecord::Base
belongs_to :movie
end
class Movie < ActiveRecord::Base
...
has_many :rating
...
end
问题是,当我尝试在我的电影控制器操作中执行以下查询时,我只获得电影实体的列,但不是评级列。换句话说,movie.rating
帮助程序不起作用。这是该查询的一个示例。
def best_rated
@movies = Movie.find_by_sql('SELECT m.movie_id, m.title, sum(r.ratingValue) FROM movie m LEFT JOIN rating r ON m.movie_id = r.movie_id group by m.movie_id')
end
我对此持续了好几个小时,是否有人有线索,我错过了什么?
答案 0 :(得分:1)
试试这个
Movie.joins(:rating).group("rating.movie_id, rating.title").sum("rating.ratingValue")
答案 1 :(得分:0)
你不是以铁路方式做这件事
首先对评级进行评级
class Movie < ActiveRecord::Base
has_many :ratings
end
数据库表中的电影应该有id字段而不是movie_id
现在,如果您想要访问电影的所有评级
Movie.first.ratings
会将所有具有movie_id eqauls的评分返回给第一个电影ID