【问题标题】:missing attribute error Rails缺少属性错误 Rails
【发布时间】:2013-12-13 14:39:38
【问题描述】:

当我收到此错误消息时,我似乎无法在视图中显示范围的结果。我正在尝试将当天的所有会员数量加起来并显示为总数

missing attribute: membership_id

我的模型和范围

class Member < ActiveRecord::Base
 belongs_to :membership
 accepts_nested_attributes_for :membership

 attr_accessible :membership_id, :forename, :middlename, :surname, :house_no, :house_name, :street, :town, :postcode, :home_tel, :mobile_tel, :work_tel, :email, :start_date, :expiry_date

scope :new_memberships_cash_today, ->() {
joins(:membership).where(:start_date => Date.today).select('ROUND(SUM(memberships.cost), 2)')
}
end

class Membership < ActiveRecord::Base
has_many :members, :dependent => :destroy
attr_accessible :membership_type, :cost 
end

然后是我的观点

columns do

  #Total amount in £ for New Memberships today
   column do
    panel "Cash Today", :class => 'NewAmountMemberships' do
     table_for Member.new_memberships_cash_today  do 
      column 'Total cash' do |c|
       c.membership.map { |e| [e.cost, e.id] }
      end 
     end     
    end
   end
  end

经过一番阅读,似乎我的 select 调用在范围内可能存在问题,因为我需要指定所有模型属性才能使用 Active Record 成功调用?

当我在选择中执行求和时,我不确定如何添加更多属性,如果是这样的话

任何帮助表示赞赏

我已经在控制台中运行了范围,这就是返回的内容

Member Load (0.1ms)  SELECT ROUND(SUM(memberships.cost), 2) FROM `members` INNER JOIN `memberships` ON `memberships`.`id` = `members`.`membership_id` WHERE `members`.`start_date` = '2013-12-13'
=> #<ActiveRecord::Relation [#<Member id: nil>]>

【问题讨论】:

  • 您的作用域返回一个对象,您可以从该对象访问的唯一内容就是总和。我可以看到您试图从范围内访问对象的成员资格。由于它没有membership_id,因此您会收到错误
  • 谢谢,所以关于如何调整我的范围以仍然返回成员模型中的列成本总和的任何想法?
  • attr_accessible :membership_id 是非常糟糕的做法!不应通过参数访问任何关联的 id。这将允许精明的用户将成员与任意成员相关联。
  • 那么如果我将其更改为membership_attributes 或者仍然可以访问,我认为我们必须包含这个以便可以访问关联的模型属性?

标签: ruby-on-rails ruby activerecord scope


【解决方案1】:

我不会在作用域中执行此操作,而是在辅助方法中执行此操作。这样您就可以获取相关记录并调用您的方法来返回总数。

类似这样的事情:

def membership_sum(memberships = [])
  sum = 0
  memberships.each { |membership| sum += membership.cost }
  sum.round
end

现在,将关联的记录存储在@memberships 变量中(从您的控制器中),然后在您的视图中使用&lt;%= membership_sum(@memberships) %&gt;

【讨论】:

  • 好的,如果你有时间,我会非常感激一个例子......我可以看看和学习的东西,谢谢
  • 只是一个小改进:memberships.map(&amp;:cost).sum.round
  • 为了清楚起见,我故意保持简单,但我喜欢你的回答@DamienRoche
  • 恐怕我不能让它工作。我已将该方法放在我的成员模型中,但是如何访问我的成员模型属性?而且我看不出我将如何在我的观点中使用它,如问题中所述?任何进一步的帮助表示赞赏
  • 是的,很抱歉,原帖说的是模型方法,但我的意思是辅助方法。你会想把它放在你的 application_helper.rb (或查看特定的帮助文件,在你的情况下为 member_helper.rb)
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 2016-06-01
  • 1970-01-01
  • 2019-10-30
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多