小编Bit*_*ise的帖子

实施急切加载以停止N + 1-Rails

我目前有一个页面,需要11秒钟才能加载。我正在使用Bullet Gem帮助我找到N + 1查询的发生位置。它给了我一些输出,但是我真的不知道该怎么做。这是Bullet的输出:

GET /events/1679/dashboard
USE eager loading detected
  RSVP => [:tickets]
  Add to your finder: :includes => [:tickets]
Call stack
  /Users/cameronbass/Desktop/Work/blackbird-rsvp/app/decorators/rsvp_decorator.rb:54:in `tickets?'
  /Users/cameronbass/Desktop/Work/blackbird-rsvp/app/views/accepted_rsvps/_list.html.erb:33:in `block in _app_views_accepted_rsvps__list_html_erb___1211423417683052584_70339569780320'
Run Code Online (Sandbox Code Playgroud)

告诉我放在这条线上

def tickets?
  rsvp.tickets.any?
end
Run Code Online (Sandbox Code Playgroud)

这是关联:

has_many :tickets, through: :attendees
Run Code Online (Sandbox Code Playgroud)

Attendee.rb

has_one :ticket
Run Code Online (Sandbox Code Playgroud)

ruby activerecord ruby-on-rails bullet eager-loading

2
推荐指数
1
解决办法
1023
查看次数

了解Elixir中的折叠

我正在阅读elixir文档,我遇到了这段代码:

List.foldl([1, 2, 3, 4], 0, fn(x, acc) -> x - acc end) # 2
Run Code Online (Sandbox Code Playgroud)

我试了一会儿才明白它在做什么,但对于我的生活,我不明白为什么这会返回2?如果有人可以花时间向我解释这一点,我很感激.

我完全明白第二个arg是一个累加器.设置为0不应该返回10?

elixir

2
推荐指数
1
解决办法
114
查看次数

List.foldr 或 List.foldl 与 Elixir 的理解

我正在阅读 Elixir 文档,并且遇到了 Elixir List 模块的“foldr”函数。我真的很难理解它。这是医生所说的:

文档管理系统

Folds (reduces) the given list from the right with a function. Requires an accumulator.

iex> List.foldr([1, 2, 3, 4], 0, fn(x, acc) -> x - acc end)
-2
Run Code Online (Sandbox Code Playgroud)

所以这应该返回-2。但是当我读到它时,我似乎认为它每次都试图将一个数字减0,如果是这样的话我们如何得到-2?我显然不明白累加器,有人可以帮我分解它吗?

elixir

2
推荐指数
1
解决办法
2741
查看次数

在函数中映射参数

我正在学习长生不老药,有一件事我不明白你看到地图作为函数参数的风格。你看到的最常见的地方是在这样的控制器中:

控制器
def create(conn, %{"league" => league_params}) do
  league = %League{}
    |> League.changeset(league_params)
    |> Repo.insert()

  case league do
    {:ok, league} ->
      conn
      |> put_flash(:info, "League Created Successfully.")
      |> redirect(to: page_path(conn, :index))
    {:error, %Ecto.Changeset{} = changeset} ->
      render(conn, "new.html", changeset: changeset)
  end
end
Run Code Online (Sandbox Code Playgroud)

所以,create/2功能。第二个参数看起来像这样%{"league" => league_params}。如果我错了,请纠正我,但这是一张地图,那么为什么我们引用下面的值League.changeset(league_params)而不是键League.changeset("league")呢?

这似乎是一个愚蠢的问题,但我无法弄清楚这个问题,而且我找不到这个问题的文档。谢谢您的帮助。

elixir phoenix-framework

2
推荐指数
1
解决办法
1030
查看次数

key:找不到user_id.Elixir Preload问题

我正在尝试在构建联盟结构时添加user_id,但它给了我这个错误:

** (KeyError) key :user_id not found in: %{__meta__: #Ecto.Schema.Metadata<:built, "leagues">, __struct__: Statcasters.Schema.League, id: nil, inserted_at: nil, name: nil, teams: #Ecto.Association.NotLoaded<association :teams is not loaded>, updated_at: nil, users: #Ecto.Association.NotLoaded<association :users is not loaded>, users_id: nil}
(stdlib) :maps.update(:user_id, {{:., [line: 14], [{:user, [line: 14], nil}, :id]}, [line: 14], []}, %{__meta__: #Ecto.Schema.Metadata<:built, "leagues">, __struct__: Statcasters.Schema.League, id: nil, inserted_at: nil, name: nil, teams: #Ecto.Association.NotLoaded<association :teams is not loaded>, updated_at: nil, users: #Ecto.Association.NotLoaded<association :users is not loaded>, users_id: nil})
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

联盟控制器

  def new(conn, _params) …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

2
推荐指数
1
解决办法
786
查看次数

Rails中的惯用CSV导出

我有一个索引视图,submissions并且在该视图中@submissions,控制器看起来像这样:

提交控制器

def index 
  @submissions = Submission.submissions_for(user: current_user)
end
Run Code Online (Sandbox Code Playgroud)

从视图中,我基本上想单击一个按钮并传递该列表中的 submissions

我曾想过要添加一条新路线,如下所示:

<%= link_to "Export", export_submissions_path(submissions: @submissions) %>
Run Code Online (Sandbox Code Playgroud)

但这感觉不太正确,因为我需要留在索引页面上。因此,当用户单击export按钮时,他们停留在index页面上,但是创建了当前数据的CSV。因此,这个问题是“如何创建CSV”,更多的是我如何停留在索引页面上并向服务器发送请求以发送CSV?

ruby csv ruby-on-rails

2
推荐指数
1
解决办法
36
查看次数

未定义的方法`each'代表nil:NilClass - Rails

我得到一个零级错误.我完全理解这个错误告诉我的是什么,但我不知道为什么它是零.在我看来应该有一个对象传递到我的表.这应该很容易调试.这是我的代码清晰.

控制器方法:

def info
  @subscriber = Subscriber.find_by_phone_number(params[:phone_number])
end
Run Code Online (Sandbox Code Playgroud)

视图:

 <% @subscriber.each do |subscriber| %>
  <tr>
   <td><%= image_tag avatar_url(subscriber) %></td>
  </tr>
 <% end %>
Run Code Online (Sandbox Code Playgroud)

错误:

 Showing /Users/intern/Desktop/Rails/rowster/app/views/subscribers/info.html.erb where line #3 raised:
 undefined method `each' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

绑定信息方法:

[1] pry(#<SubscribersController>)> @subscriber
 => nil
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请告诉我?

ruby ruby-on-rails

1
推荐指数
1
解决办法
1681
查看次数

如何使用Ruby on Rails将字符串转换为数组

我有一个文本字段,它接受一个字符串值,如

"games,fun,sports"
Run Code Online (Sandbox Code Playgroud)

我的主要目标是获取字符串并将其转换为如下所示的数组:

[games, fun, sports]
Run Code Online (Sandbox Code Playgroud)

在我拥有的集成对象的filters属性中.现在我有一个似乎不起作用的方法的开头.

这是我的代码:

视图:

  <%= form_for @integrations, url: url_for(:controller => :integrations, :action => :update, :id => @integrations.id) do |f| %>
   <%= f.label :filters %>
   <%= f.text_field :filters, class: "filter-autocomplete" %>
   <%= f.submit "Save" %>
  <% end %> 
Run Code Online (Sandbox Code Playgroud)

这是接收字符串的文本字段.

模型:

def filters=(filters)

end
Run Code Online (Sandbox Code Playgroud)

这是我想从字符串切换到数组的地方.

控制器:

 def update
    @integrations = current_account.integrations.find(params[:id])

    if @integrations.update_attributes(update_params)
      flash[:success] = "Filters added"
      redirect_to account_integrations_path
    else
      render :filters
    end
  end

  def filters
    @integrations = current_account.integrations.find(params[:id])
  end

  private

  def update_params
    [:integration_webhook, :integration_pager_duty, :integration_slack].each do …
Run Code Online (Sandbox Code Playgroud)

ruby arrays string ruby-on-rails

1
推荐指数
1
解决办法
7069
查看次数

从GenServer检索所有状态

我的GenServer中有一个状态原子数组.我不想只是弹出队列中的最后一项,我想立即弹出所有状态.

现行守则(不工作)

defmodule ScoreTableQueue do
  use GenServer

  @impl true
  def init(stack) do
    {:ok, stack}
  end

  @impl true
  def handle_call(:pop, _from, [state]) do
    {:reply, [state]}
  end

  @impl true
  def handle_cast({:push, item}, state) do
    {:noreply, [item | state]}
  end
end
Run Code Online (Sandbox Code Playgroud)

GenServer状态:

{:status, #PID<0.393.0>, {:module, :gen_server},
 [
   [
     "$initial_call": {ScoreTableQueue, :init, 1},
     "$ancestors": [#PID<0.383.0>, #PID<0.74.0>]
   ],
   :running,
   #PID<0.393.0>,
   [],
   [
     header: 'Status for generic server <0.393.0>',
     data: [
       {'Status', :running},
       {'Parent', #PID<0.393.0>},
       {'Logged events', []}
     ],
     data: [{'State', [:code, :hello, :world]}]
   ]
 ]} …
Run Code Online (Sandbox Code Playgroud)

elixir

1
推荐指数
1
解决办法
50
查看次数

将项目模块导入IEX会话

我有一个名为的应用程序MyApp,每当我通过它打开IEx会话时,iex -S mix都必须像这样调用回购协议:MyApp.Repo.all(MyApp.User)

如果我可以自动导入项目模块,那么我将很喜欢,因此我只需这样做Repo.all(User)即可获得与上述相同的值。

有没有办法可以做到这一点?

elixir

1
推荐指数
1
解决办法
87
查看次数