【问题标题】:Converting string to active record query statement将字符串转换为活动记录查询语句
【发布时间】:2014-01-28 11:02:22
【问题描述】:

在我的一个视图页面中,我正在使用老式的数据呈现方式,但在将“User.country.name”之类的字符串转换为查询语句时遇到问题。 我正在使用如下循环:

@columns = ['id','email','name','country.name']

table = User.all

<% table.each do |row| %>
    <% @columns.each do |field| %>
         <%= row[field] %>
    <% end %>
<% end %>

该表显示了除“country.name”列之外的几乎所有数据。我不能对 country.name 使用 constantize 它给了我错误。有什么解决办法吗?谢谢

【问题讨论】:

  • 如果我写 row[field].constantize 它显示:NoMethodError in Table#show_table ,未定义的方法 `constantize'。如果没有常量化,它会显示每一行的 id、email 和 name 字段,除了最后一个字段为空

标签: mysql ruby-on-rails ruby activerecord rails-activerecord


【解决方案1】:

您的User 没有属性country.name,它有一个关联 country,而该关联有一个属性name

你可以设置一个delegate:

 class User < ActiveRecord::Base
   delegate :name, to: :country, prefix: true
   # ...
 end

这会创建一个方法User#country_name,返回country.name

现在您可以调整循环,使用 public_send 调用方法:(我更改了变量名称以使其更清晰)

@methods = [:id, :email, :name, :country_name]

records = User.all

<% records.each do |record| %>
  <% @methods.each do |method| %>
    <%= record.public_send(method) %>
  <% end %>
<% end %>

【讨论】:

    【解决方案2】:
    @users = User.select(:id, :email).joins(:countries)
    
    <% @users.each do |user| %>
      <%= user.id %>
      <%= user.email %>
      <%= user.countries %>
    <% end %>
    

    http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-joins

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 2015-07-17
      • 1970-01-01
      相关资源
      最近更新 更多