Rails动态设置has_many值

时间:2017-05-16 08:08:29

标签: ruby-on-rails rails-activerecord

我有一个实体:Book of book

实体类与其他表格有has_many关系,例如pages

假设page_1page_2是我想要保存的有效值。非动态版本类似于:

entity.pages = [page_1, page_2]

如何动态设置?

我尝试使用send(对于has_one工作正常)没有运气:

attr = :pages # my dynamic attribute 

book.send(attr) = [page_1, page_2]
# SyntaxError: unexpected '=', expecting end-of-input
# mc.send(:diagnoses, '=') = [s]
#                           ^

当我使用<<时,似乎有效:

book.send(attr) << page_1

但问题是我需要支持删除,例如如果这本书有第3页,现在它有第1页和第2页。

由于性能和安全性,我不想使用eval。不确定它是否相关,但这些动态属性都具有相同的类 - has__many具有动态条件。

2 个答案:

答案 0 :(得分:2)

正确的格式是调用setter(赋值)方法。通常是属性后跟等号。在您的情况下,您需要pages=

book.send(attr.to_s + '=', [page_1, page_2] )

相当于

book.send('pages=', [page_1, page_2])

这是......

book.pages=([page_1, page_2])

或更常规编写的

book.pages = [page_1, page_2]

答案 1 :(得分:0)

尝试book.association(:pages).target