Как сделать has_many: через ассоциацию со светильниками? - PullRequest
0 голосов
/ 08 сентября 2011

Я не могу использовать factory_girl, потому что я тестирую солнечное пятно и мне нужна реальная база данных.

Редактировать : нет.Может работать с солнечным пятном.Я ошибаюсь.

Как я могу построить has_many: через (много-много) ассоциаций в осветителях?

Я гуглю и получаю неверное решение

Редактировать :

Наконец я использую factory_girl.Я google-copy-paste фрагмент:

factory :tagging do 
    question { |a| a.association(:question) } 
    tag { |a| a.association(:tag) } 
end

(вопрос has_many теги через теги, и наоборот)

Это работает хорошо.Но что это?Readme фабричной девушки не подразумевает этот синтаксис.Может кто-нибудь объяснить?

Ответы [ 3 ]

1 голос
/ 09 сентября 2011

Вы можете найти официальную документацию для factory_girl, которая очень полная, здесь .

Здесь - хороший (более короткий) блог, объясняющий factory_girl 2 (сравнивая его с factory-girl 1).

ОБНОВЛЕНИЕ:

Чтобы немного объяснить код:

 factory :tagging do
   association :tag
 end

будет искать фабрику с именем :tag и создаст этот объект, а затем свяжет его с ассоциацией tag (например, belongs_to), которая находится внутри вашего объекта :tagging.

Обратите внимание: это заводская установка по умолчанию. Если вы хотите, чтобы taggings поделился tag, вам нужно будет сделать что-то вроде

@tag = Factory(:tag)
@tagging_1 = Factory(:tagging, :tag => @tag)
@tagging_2 = Factory(:tagging, :tag => @tag)

Надеюсь, это поможет.

1 голос
/ 08 сентября 2011

Если это классическая ассоциация has_and_belongs_to_many, без другой информации в модели ассоциации, я думаю, что соглашения позволяют вам писать свои приборы следующим образом:

#users.yml
john:
  first_name: John
  last_name: Doe
  hobbies: [swim, play_tennis]

#hobbies.yml
swim:
  name: Swim

play_tennis:
  name: Play Tennis

Но я не совсем уверен!

0 голосов
/ 14 мая 2015

Я использовал светильники при тестировании для has_many :through по хэшу merge

# posts.yml
one:
  title: "Railscasts"
  url: "http://railscasts.com/"
  description: "Ruby on Rails screencasts"

# categories.yml
one:
  name: "magazine"
two:
  name: "tutorial"
three:
  name: "news"
four:
  name: "Ruby"

# posts_controller_test.rb
def test_post_create
  assert_difference 'Post.count' do
    post :create, post: posts(:one).attributes
     .merge(categories: [categories(:two), categories(:four)])
  end
end

когда после добавления другого файла фикстуры, и попытался это, он не работал

# post_categories.yml
one:
  post: one
  category: two
two:
  post: one
  category: four

def test_post_create
  assert_difference 'Post.count' do
    post :create, post: posts(:one)
  end
end

puts posts(:one).attributes
# {"id"=>980190962, "url"=>"http://railscasts.com/", "title"=>"Railscasts", "description"=>"Ruby on Rails screencasts", "created_at"=>Thu, 14 May 2015 18:27:20 UTC +00:00, "updated_at"=>Thu, 14 May 2015 18:27:20 UTC +00:00}

puts posts(:one).attributes
      .merge(categories: [categories(:two), categories(:four)])
# {"id"=>980190962, "url"=>"http://railscasts.com/", "title"=>"Railscasts", "description"=>"Ruby on Rails screencasts", "created_at"=>Thu, 14 May 2015 18:30:23 UTC +00:00, "updated_at"=>Thu, 14 May 2015 18:30:23 UTC +00:00, "category_ids"=>[980190962, 1018350795]}
...