【问题标题】:Cannot fetch associated values in rails application无法在 Rails 应用程序中获取关联值
【发布时间】:2014-01-04 08:52:40
【问题描述】:

我正在现有 MySQL 数据库上构建一个轻量级 Web 用户界面 rails (4.0.0) 应用程序作为数据集成方案。我无法获取主实体 Movie 的关联值。

我通过没有迁移的脚手架生成了所有东西(因为给定了数据库)。这些是我的两个表的定义,应该关联。这些表具有单数名称。所以我在我的 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

我为此苦苦挣扎了好几个小时,有人知道我错过了什么吗?

【问题讨论】:

    标签: mysql sql ruby-on-rails associations


    【解决方案1】:

    试试这个

    Movie.joins(:rating).group("rating.movie_id, rating.title").sum("rating.ratingValue")
    

    【讨论】:

    • 我试过Movie.joins(:rating).group("rating.movie_id").sum("rating.ratingValue"),它给了我movie_id => sum(rating.ratingValue)的哈希值,所以我快到了。但是我还需要电影的标题,我现在怎么做?
    • 当你将它与组函数一起使用时,它不会返回字段。
    • 我没有用 select 弄明白。但似乎我的解决方案是Movie.joins(:rating).group("movie.title, rating.movie_id").sum("rating.ratingValue")。它给了我想要的结果。非常感谢 HarsHarl,你帮了我很多!
    • 我应该编辑你的答案吗?还是这样离开线程?我是 StackOverflow 的新手。
    【解决方案2】:

    你不是用 Rails 方式做的

    先给收视率打分

    class Movie < ActiveRecord::Base
    has_many :ratings
    end
    

    在数据库表中 movies 应该有 id 字段而不是 movie_id

    现在,如果您想访问电影的所有评级

    Movie.first.ratings 
    

    将返回所有电影 ID 等于第一个电影 ID 的评分

    【讨论】:

    • 我知道这不是 Rails 方式,如果我可以更改数据库架构,我肯定会按照您的建议进行操作,在这种情况下这是不可能的。
    猜你喜欢
    • 2013-06-25
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2014-09-15
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多