gpt4 book ai didi

ruby-on-rails - 如何使用 has_many :through and honor :conditions? 创建新记录

转载 作者:行者123 更新时间:2023-12-04 04:01:49 26 4
gpt4 key购买 nike

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

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')

我原以为可以使用关联建立新记录,并且会产生:
  • 新的学生记录 ('Joe Student')
  • 新的成员(member)记录(course_id = 37,student_id = (joe),observer = true)

  • 但相反,我得到:
    ActiveRecord::AssociationTypeMismatch: Membership expected, got Array

    我敢肯定我对这是如何做到的感到非常困惑,并且希望得到任何见解!我也尝试使用 Membership 模型上的命名范围来执行此操作,但我似乎无法让 has_many 在关联中使用范围。

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

    最佳答案

    相信你遇到过Rails bug。我在我的盒子(2.3.4)上尝试了同样的事情,它给了我同样的错误,这似乎根本不正确。此外,我还尝试了以下解决方法:

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

    但这会创建一个成员,其中观察者字段设置为 !

    我想出的最后一个丑陋的解决方法是创建 Membership手动记录:
    Membership.create!(:course => Course.first, :student => Student.first, :observer => true)

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

    编辑 : 我已经按照 promise ,进一步调查发现如果你改变你的 :conditions散列到一个数组,例如:
    :conditions => ["memberships.observer = ?", true]

    它按预期工作。我也有 github repository带有示例代码和复制说明。

    关于ruby-on-rails - 如何使用 has_many :through and honor :conditions? 创建新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514880/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com