我正在尝试为我的某个模型创建最简单的has_many
关系。它定义如下:
# i know it doesn't make much sense. I'm using such ridiculous
# where case to keep things simple for now
has_many :jobs, -> { where(id: 1) }, class_name: SidekiqJob
但是,当我试图以任何方式调用该关系时,例如使用MyModel.last.jobs
,rails会抛出:
NoMethodError: undefined method `name' for nil:NilClass
from /Volumes/HDD/Users/michal/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.3/lib/active_record/relation/merger.rb:141:in `block in filter_binds'
有没有人知道这里出了什么问题?
原始协会定义:
has_many :jobs, (obj) -> { where('jid LIKE ?', "#{obj.superjob_id}%") }, class_name: SidekiqJob
答案 0 :(得分:1)
has_many :jobs, -> { where(id: 1) }, class_name: SidekiqJob
如果没有深入查看源代码以查看to_s
值上是否有类似class_name
的内容,则会显示语法错误,并且需要在类名称周围加上引号:
has_many :jobs, -> { where(id: 1) }, class_name: "SidekiqJob"
请在此处查看RailsGuides:http://guides.rubyonrails.org/association_basics.html#scopes-for-has-many-where
class Author < ApplicationRecord
has_many :confirmed_books, -> { where "confirmed = 1" },
class_name: "Book"
end
来自3_2_release_notes.md:https://github.com/rails/rails/blob/37b36842330b5db1996fda80e387eae3a5781db8/guides/source/3_2_release_notes.md
允许关联的:class_name选项使用符号 除了一个字符串。这是为了避免让新手感到困惑 与其他选项一致的事实如:foreign_key已经存在 允许符号或字符串。
has_many :clients, :class_name => :Client # Note that the symbol need to be capitalized
答案 1 :(得分:0)
原来它与ruby / active_record版本有关。根据这个帖子:create with has_many through association gets NoMethodError (undefined method `name' for nil:NilClass)
我所做的“修复”是将我的ruby版本更改为2.1.10
。然后,我摆脱了这些错误(因为他们被扔进了更多的地方)。无论如何,我仍然无法includes
我在OP中定义的关系。似乎使用custom where语句includes
关系是不可能的。