【问题标题】:How can I create new records with has_many :through and honor :conditions?如何使用 has_many :through 和 Honor :conditions 创建新记录?
【发布时间】:2010-12-03 15:31:36
【问题描述】:

假设我有一门课程,学生可以通过会员资格注册(例如课程和学生的 has_and_belongs_to_many 关系)。有些会员资格适用于只是观察课程的学生(不是为了学分等),所以:

class Course < ActiveRecord::Base
  has_many :memberships

  has_many :students,
           :through => :memberships

  has_many :observers,
           :through => :memberships,
           :source => :student,
           :conditions => { :memberships => { :observer => true }}
end

以下是最有效的方法:

observers = Course.find(37).observers

以下是不起作用的:

new_observer = Course.find(37).observers.build(:name => 'Joe Student')

我原以为可以使用关联建立新记录,并且会生成:

  1. 新的学生记录('Joe Student')
  2. 新的会员记录(course_id = 37,student_id = (joe),observer = true)

但是我得到了:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array

我确信我完全不知道这是怎么回事,如果有任何见解,我将不胜感激!我也尝试使用 Membership 模型上的命名范围来执行此操作,但我似乎无法让 has_many 在关联中使用范围。

非常感谢您提供的任何帮助!

【问题讨论】:

    标签: ruby-on-rails activerecord associations has-many-through


    【解决方案1】:

    我相信您遇到了 Rails 错误。我在我的盒子(2.3.4)上尝试了同样的事情,它给了我同样的错误,这看起来根本不对。此外,我还尝试了以下解决方法:

    course = Course.first
    course.observers << Student.create(:name => "Joe Student")
    course.save
    

    但这会创建一个将观察者字段设置为 false 的成员资格!

    我想出的最后一个丑陋的解决方法是手动创建Membershiprecord:

    Membership.create!(:course => Course.first, :student => Student.first, :observer => true)
    

    我已经created a ticket for this,早餐后我会进一步调查。

    编辑:按照承诺,我已进一步调查并发现您是否将 :conditions 哈希更改为数组,例如:

    :conditions => ["memberships.observer = ?", true]
    

    它按预期工作。我还有一个github repository,其中包含要复制的示例代码和说明。

    【讨论】:

    • 谢谢!!非常有帮助!唉,仍然不是 100%。观察者布尔值未在 sql 中设置:c.observers.create!(:name => 'abby') => Student Create (2.0ms) INSERT INTO "students" ("name", "updated_at", "created_at") VALUES('abby', '2009-1 0-04 12:41:35', '2009-10-04 12:41:35') Membership Create (0.0ms) INSERT INTO "memberships" ("observer", " updated_at”、“student_id”、“course_id”、“created_at”)值(NULL,'2009-10-04 12:41:35', 4, 2, '2009-10-04 12:41:35')* * 注意观察者的值(NULL)。
    • 愚蠢的问题:这个问题仍然存在还是哈希条件在构建记录时工作正常? (设置observer: true)。或者也许有更好的方法(我们说的是 rails4)
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2011-02-20
    • 2019-10-29
    • 2014-02-27
    • 2011-10-25
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    相关资源
    最近更新 更多