【问题标题】:Ruby on Rails, Model JoinsRuby on Rails,模型连接
【发布时间】:2010-07-30 15:04:42
【问题描述】:

我有 2 个模型:

class Video < ActiveRecord::Base
belongs_to :categories, :foreign_key => "category", :class_name => "Category"
end

class Category < ActiveRecord::Base
has_many :videos
end

到目前为止,这很好,在我的索引页面的视频控制器中:

def index
@videos = Video.all(:joins => :categories)

etc, etc
end

上面产生以下 SQL 查询:SELECT videos.* FROM videos INNER JOIN categories ON categories.id = videos.category

这在某种程度上很好,基本上我需要获取类别名称(该表中的一个字段),这样我就不必在视图中进行另一个调用来根据类别 id 获取类别名称.有什么想法吗?

谢谢,是的,我是 ruby​​ 新手,我尝试阅读 API,但在那里找不到太多帮助。

【问题讨论】:

    标签: ruby-on-rails activerecord join


    【解决方案1】:

    如果认为您的Video 类中的关联设置不正确。应该是:

    class Video < ActiveRecord::Base
      belongs_to :category
    end
    

    你可以@videos = Video.all(:include =&gt; :category)。这将使用单个 SQL 语句检索视频和相关类别记录。

    顺便说一句,belongs_to 关联上的 :class_name 选项是多余的,因为 ActiveRecord 已经自动从关联名称推断出类名称。如果您想拥有一个与基础类不同的关联名称,则应仅使用此选项,例如作者/个人。

    【讨论】:

    • 当我这样做时,查询变为:SELECT * FROM videos 没有加入或什么都没有,这实际上是我以前的方式,但它从来没有工作过...... :(
    • 感谢 John,我之所以拥有 :class_name 并将其重命名为 :categories,是因为如果我不这样做,编辑时会出现以下错误:ActiveRecord::AssociationTypeMismatch in VideosController#更新类别(#2175068700)预期,得到字符串(#2148246520)我发现绕过这个的唯一方法是通过执行上述操作......我想我手上的东西太乱了哈哈。
    • 顺便说一句,在节目和索引屏幕上运行良好,现在我如何让编辑和新屏幕正常工作?感谢您的帮助顺便说一句
    • 听起来你的联想有点乱。如果您按照我的回答进行设置,您的 videos 表应该有一个 category_id 外键整数字段。如果没有看到您的代码,就不可能回答您关于编辑和新屏幕的问题!您应该将其作为一个单独的问题发布。
    • 谢谢约翰!!!1 我将字段更改为 category_id,我的所有问题都消失了。我欠你一百万!!!大声笑
    【解决方案2】:
    join_condition = " ,categories where INNER JOIN categories ON categories.id=videos.category"
    
    @videos = Video.all(:joins => join_condition)
    

    试试这个

    【讨论】:

    • 我认为join语句不正确:Mysql::Error: You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“INNER JOIN categories ON categories.id=videos.category”附近使用正确的语法: SELECT videos.* FROM videos ,categories where INNER JOIN categories ON categories.id=videos.category
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多