ruby-on-rails - 通过带作用域的关联保存时丢失属性 (Rails 4.0.0)

标签 ruby-on-rails ruby activerecord associations ruby-on-rails-4

代码(Rails 4.0.0)

class Track < ActiveRecord::Base
  has_many :artist_tracks
  has_many :owning_artists,
              -> { where(:artist_tracks => { :artistic_role_id => 1 }) },
              :through => :artist_tracks,
              :source => :artist
end

class ArtistTrack < ActiveRecord::Base
  belongs_to :artist
  belongs_to :track
  belongs_to :artistic_role
end

class Artist < ActiveRecord::Base
  has_many :artist_tracks
  has_many :tracks, :through => :artist_tracks
end

寻找作品

# artist_tracks.artistic_role_id is properly set to "1"
2.0.0p195 :003 > Track.last.owning_artists

  Track Load (1.1ms)  SELECT "tracks".* FROM "tracks" ORDER BY "tracks"."id" DESC LIMIT 1
  Artist Load (0.8ms)  SELECT "artists".* FROM "artists" INNER JOIN "artist_tracks" ON "artists"."id" = "artist_tracks"."artist_id" WHERE "artist_tracks"."artistic_role_id" = 1 AND "artist_tracks"."track_id" = $1  [["track_id", 10]]

创建不工作

# artist_tracks.artistic_role_id is totally missing from the INSERT

2.0.0p195 :005 > Track.create!(name: "test_name", lyrics: "test_lyrics", owning_artist_ids: [1])

  Artist Load (1.3ms)  SELECT "artists".* FROM "artists" WHERE "artists"."id" = $1 LIMIT 1  [["id", 1]]
   (0.5ms)  BEGIN
  Artist Exists (0.7ms)  SELECT 1 AS one FROM "artists" WHERE ("artists"."name" = 'TestArtist1' AND "artists"."id" != 1) LIMIT 1
  SQL (0.7ms)  INSERT INTO "tracks" ("created_at", "lyrics", "name", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Thu, 13 Jun 2013 22:20:14 UTC +00:00], ["lyrics", "test_lyrics"], ["name", "test_name"], ["updated_at", Thu, 13 Jun 2013 22:20:14 UTC +00:00]]
#
# Y U NO have artist_tracks.artistic_role_id?
#
  SQL (0.7ms)  INSERT INTO "artist_tracks" ("artist_id", "created_at", "track_id", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["artist_id", 1], ["created_at", Thu, 13 Jun 2013 22:20:14 UTC +00:00], ["track_id", 12], ["updated_at", Thu, 13 Jun 2013 22:20:14 UTC +00:00]]
   (1.0ms)  COMMIT

根据Rails Guide for Active Record Associations (4.3.3.1 where) ,我相信我对范围和期望的使用是有效的:

If you use a hash-style where option, then record creation via this association will be automatically scoped using the hash.

为什么 artist_tracks.artistic_role_id 属性丢失了?如果我的期望是错误的,我想了解为什么以及如何实现替代解决方案。

我也将其列为 an issue on the Rails repo .任何见解表示赞赏!谢谢

最佳答案

我相信发生的事情是这里实际创建的关联模型是连接模型,artist_tracks,而不是与它上面的实际情况的关联。您可以通过声明一个带有条件的替代连接关联,然后通过它附加 owning_artists 来解决这个问题。像这样:

class Track < ActiveRecord::Base
  has_many :artist_tracks
  has_many :owning_artist_tracks,
              -> { where(:artistic_role_id => 1) },
              :class_name => "ArtistTrack"
  has_many :owning_artists,
              :through => :owning_artist_tracks,
              :source => :artist
end

关于ruby-on-rails - 通过带作用域的关联保存时丢失属性 (Rails 4.0.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17098708/

相关文章:

ruby-on-rails - 如果 Devise 的 current_user 为零,则创建后备

ruby-on-rails - Rails - 查询时移

css - SASS 未正确预处理

ruby-on-rails - 确保在保存并创建主模型后创建或保存关联 Rails 4

ruby-on-rails - 通过比较两个日期范围是否重叠来过滤 Rails 查询

ruby-on-rails - Heroku 未初始化常量 Rails :Initializer (NameError) (noWWW Rack Middleware)

ruby-on-rails - 在 activeadmin 资源中需要范围

javascript - Stripe::InvalidRequestError(必须提供来源或客户。):Stripe

ruby-on-rails - 如何限制发送到 Algolia 的记录?

mysql - SQL SUM 连接问题