Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过带有范围的关联保存时丢失属性(Rails 4.0.0) 代码(Rails 4.0.0) 创建不起作用_Ruby On Rails_Ruby_Activerecord_Associations_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 通过带有范围的关联保存时丢失属性(Rails 4.0.0) 代码(Rails 4.0.0) 创建不起作用

Ruby on rails 通过带有范围的关联保存时丢失属性(Rails 4.0.0) 代码(Rails 4.0.0) 创建不起作用,ruby-on-rails,ruby,activerecord,associations,ruby-on-rails-4,Ruby On Rails,Ruby,Activerecord,Associations,Ruby On Rails 4,根据,我相信我对范围和期望的使用是有效的: 如果使用哈希样式where选项,则通过以下方式创建记录 关联将使用哈希自动确定范围 为什么artist\u tracks.artist\u role\u id属性丢失?如果我的期望是错误的,我想了解为什么以及如何实施替代解决方案 我还将此列为。任何洞察都将不胜感激!谢谢你我相信这里实际创建的关联模型是连接模型,artist\u tracks,而不是与实际情况的关联。您可以通过声明一个带有条件的备用连接关联,然后通过该关联附加owning\u artis

根据,我相信我对范围和期望的使用是有效的:

如果使用哈希样式where选项,则通过以下方式创建记录 关联将使用哈希自动确定范围

为什么
artist\u tracks.artist\u role\u id
属性丢失?如果我的期望是错误的,我想了解为什么以及如何实施替代解决方案


我还将此列为。任何洞察都将不胜感激!谢谢你

我相信这里实际创建的关联模型是连接模型,
artist\u tracks
,而不是与实际情况的关联。您可以通过声明一个带有条件的备用连接关联,然后通过该关联附加
owning\u 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
classtrack{其中(:艺术角色id=>1)},
:class_name=>“ArtistTrack”
有很多:拥有艺术家,
:通过=>:拥有\u艺术家\u曲目,
:source=>:艺术家
结束

我是否正确理解您:您假设在创建关联时,应将
艺术角色id
设置为在关联范围内?是的,这是正确的。在rails3中,这应与
:conditions
属性一起使用。我在rails4中的rails4中找不到任何关于这方面的文档:条件已被弃用,而不是使用lambda,rails会抱怨它,并发出弃用警告。我会尝试在指南邮件列表中问这个问题。我在发布我的问题之前确实尝试过这段代码,不幸的是,条件(拥有\u艺术家\u曲目。艺术角色\u id)在
INSERT
语句中仍然完全缺失。有趣的是,在Rails 3中,您的方法是有效的(假设您使用
:conditions
而不是lambda(
:conditions
在Rails 4中被弃用)).啊,我明白了。我承认我没有Rails 4的经验,所以这个建议确实是基于Rails 3的。
# 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
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