在 Javascript 中使用 Rails 关联

Posted

技术标签:

【中文标题】在 Javascript 中使用 Rails 关联【英文标题】:Using Rails Associations in Javascript 【发布时间】:2015-05-13 21:40:28 【问题描述】:

我正在尝试使用 ajax 和 rails 创建一个提要,以获取管理员和警报的活动。当我第一次创建视图时,我只使用了 rails,但我决定希望每次使用 ajax 在数据库中有新活动时更新一个提要。我的 ajax 函数可以正常工作,但我意识到我有很多无法调用的关联,因为它是 javascript 而不是 rails。我想知道如何使用联接将查询的 id 替换为创建警报的人的用户名,例如 activity.alert.username

action: "已创建警报" admin_id:空 alert_id: 17 类别:“警报” created_at:“2015-05-13T04:12:47.862Z” 编号:6 school_id: 1 更新时间:“2015-05-13T04:12:47.862Z”

class ActivitiesController < ApplicationController
    before_filter :authenticate_admin!
    def index
        @activities = Activity.where(:school_id => current_admin.school.id).order("created_at DESC").limit(20)
        respond_to do |format|
            format.json  render json: @activities
            format.html 
        end
    end
end

旧视图

- @activities.each do |activity|
    %div.panel.panel-default
        %div.panel-body
            - if activity.admin_id != nil
                %span.action
                    = activity.admin.email
                    = activity.action
            - else
                %span.action
                    = activity.alert.user.username
                    = activity.action

            %span.timestamp
                #activity.created_at.strftime("%b %d %Y %l:%M %p")
            %span.category
                #activity.category

新视图

%div#activity-feed

:javascript

    getActivity();

    function getActivity()

        $.getJSON("activity", function(data) 

            for(var i = 0; i < data.length; i++)
                var feed = "<div class='panel panel-default'> <div class='panel-body'>" + "<span>" + data[i].action + "</span>" + "</div> </div>";
            

            $("#activity-feed").html(feed);

                    console.log(data);

        );
    

    setInterval(function() 
        getActivity();
    , 5000);

【问题讨论】:

【参考方案1】:

您需要在控制器(即 Rails)中处理数据关联,因为 Rails 是可以直接访问数据库的层。基本上,您要做的是从控制器中的数据库中加载所有必要的数据,然后将其发送回客户端(Javascript)以供其使用。

您可以使用“包含”来包含关联的对象。

@activities = Activity.include(:alert).where...

【讨论】:

是的,这就是我想知道如何实现加入来做到这一点 我刚刚更新了答案。您可以使用包含。我希望这会有所帮助。 它仍然给我 id 而不是用户名

以上是关于在 Javascript 中使用 Rails 关联的主要内容,如果未能解决你的问题,请参考以下文章

从控制台获取 rails 关联

如何在 Rails 中使用插入所有方法,包括关联?

如何在 Rails 中观察新的或破坏的关联

Rails 5 - 使用多态关联 - 渲染视图

ruby on rails 在关联调用中使用变量

如何在 Rails 中使用 Cloudinary 将直接上传字段与模型相关联?