我知道我可以编写attr_accessor:tag_list来为Rails中的对象创建一个虚拟属性tag_list.这允许在对象的表单中存在tag_list属性.
如果我使用attr_accessor:tag_list,我可以在模型中对tag_list执行操作以从表单中提取和操作数据.
我想知道的是,而不是写attr_accessor,我怎么会写一个getter和setter,将完全复制的attr_accessor默认功能.例如:
def tag_list
#what goes here
end
Run Code Online (Sandbox Code Playgroud)
仅供参考我尝试过
def tag_list
@tag_list
end
Run Code Online (Sandbox Code Playgroud)
这不起作用.
ruby ruby-on-rails virtual-attribute attr-accessor ruby-on-rails-3
我有一个属性'first'和'last'的用户模型所以例如User.first.first#=>"Charlie"User.first.last#=>"Brown"
此用户模型还具有虚拟属性"full_name"
#user.rb
def full_name
[first,last].join(' ')
end
def full_name=(name) #don't know what to do with people w/ middle names
split = name.split(' ')
self.first = split[0]
self.last = split[1]
end
Run Code Online (Sandbox Code Playgroud)
例如:
User.first.full_name = "Charlie Brown" #=> "Charlie Brown"
User.first.full_name = "Homer Simpson" #=> "Home Simpson"
User.first.save
User.first.first #=> "Homer"
User.first.last #=> "Simpson"
Run Code Online (Sandbox Code Playgroud)
如果我可以通过该虚拟属性进行搜索,例如动态查找,那就太好了:
User.find_by_full_name('Home Simpson') # this doesn't work
Run Code Online (Sandbox Code Playgroud)
查找条件的示例:
User.all(:conditions => ['full_name LIKE ?', query]) #this doesn't work
Run Code Online (Sandbox Code Playgroud)
我希望在SQL语言中至少找到一些可以做到这一点的方法; 如果还有一个动态虚拟属性查找,那就是在结构上的额外香草源.(今年冬天有这个人吗?)
我还担心被搜索的名称,例如,"Holmes"可能只能在"第一"列中搜索,而不能搜索到"最后"列,例如User.first.full_name #=> "Sherlock Holmes"
.
我确实尝试过更全面的搜索:
sql ruby-on-rails find virtual-attribute conditional-statements
您好我正在尝试设置仅在特定表单视图中调用的验证,为此我尝试在表单上为虚拟属性创建hidden_field并将其设置为值,然后验证:如果虚拟属性等于该值.
到目前为止,我有:
## user model
validates_presence_of :password_confirmation, :if => :confirmation_validation
attr_accessible :email, :password, :password_confirmation,
:remember_me, :name, :avatar, :username, :bio, :confirmation_validation
def confirmation_validation
# not sure what goes here???
end
## form view
<%= form_for(resource, :validate => true, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }, :html => {:multipart => true}) do |f| %>
<%= devise_error_messages! %>
<p><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password %></p>
<p><%= …
Run Code Online (Sandbox Code Playgroud) 我如何在rails 4中使用虚拟属性(getter,setter),因为'attr_accessible'已被删除.
我在这里遇到问题
def tags_list
@tags = self.tags.collect(&:name).join(', ')
end
Run Code Online (Sandbox Code Playgroud)
在尝试更新/创建时,我可以达到上述方法,但无法达到下面的setter.
def tags_list=(tags)
@tags = tags
end
Run Code Online (Sandbox Code Playgroud) ruby-on-rails virtual-attribute attr-accessor ruby-on-rails-4
我有一个dropDownList
在我看来,它是由填充clients
表,表中包含样柱first_name
,last_name
,id
等等,现在我想展示first_name
并last_name
作为显示文本和id
在下拉列表中的值,我有做id
的价值和first_name
作为显示文本,但在这里我想组合这些列(first_name
和last_name
)并用作显示文本.
在模型中
function getClients()
{
$Clients = Client::model()->findAll();
$list = CHtml::listData($Clients , 'client_id', 'first_name');
return $list;
}
Run Code Online (Sandbox Code Playgroud)
在视野中
echo $form->dropDownList($model,'client_id',$model->getClients());
Run Code Online (Sandbox Code Playgroud) 我在我的Rails 3.2应用程序中遇到问题,其中通过JSON重新发送的虚拟属性不在params散列中的正确位置.嗯,这不是我所期待的.我的期望是否正确还有待观察.:)
我有一个使用标准虚拟属性模式的模型,如下所示:
class Track < ActiveRecord::Base
def rating
# get logic removed for brevity
end
def rating=(value)
# set logic
end
def as_json(options={}) # so my method is in the JSON when I use respond_with/to_json
super(options.merge(methods: [:rating]))
end
end
Run Code Online (Sandbox Code Playgroud)
发送到我的控制器的JSON如下所示:
{"id":1,"name":"Icarus - Main Theme 2","rating":2}
Run Code Online (Sandbox Code Playgroud)
要清楚,名称和ID不是虚拟的,评级是.
在rails实现其魔力之后,我最终在params哈希中得到了这个:
{"id"=>"1", "name"=>"Icarus - Main Theme 2", "rating"=>2, "track"=>{"id"=>"1", "name"=>"Icarus - Main Theme 2"}}
Run Code Online (Sandbox Code Playgroud)
如您所见,id和name使其成为嵌套的:track散列,但是rating不是.这是预期的行为吗?它打破了(在某种程度上)在控制器中使用嵌套哈希的标准做法,因为嵌套哈希不包含我需要的所有参数.
Track.update(params[:id], params[:track]) # :track is missing rating
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我正在寻找一种方法来解决以下问题:
Event模型datetime
中的两个属性:
start_at: datetime
end_at: datetime
Run Code Online (Sandbox Code Playgroud)
我想使用3个字段以表格形式访问它们:
event_date
start_time
end_time
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是如何将实际和虚拟属性保持在"同步",以便可以通过表单和/或直接通过start_at
&更新模型end_at
.
class Event < ActiveRecord::Base
attr_accessible :end_at, :start_at, :start_time, :end_time, :event_date
attr_accessor :start_time, :end_time, :event_date
after_initialize :get_datetimes # convert db format into accessors
before_validation :set_datetimes # convert accessors into db format
def get_datetimes
if start_at && end_at
self.event_date ||= start_at.to_date.to_s(:db) # yyyy-mm-dd
self.start_time ||= "#{'%02d' % start_at.hour}:#{'%02d' % start_at.min}"
self.end_time ||= "#{'%02d' % end_at.hour}:#{'%02d' % end_at.min}"
end
end
def set_datetimes
self.start_at …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用notes对象上的标记虚拟属性来实现一个简单的标记系统.标签包含标签和user_id.我想要做的是根据标签字段中的内容将HABTM更新为与笔记的关系.我知道find_or_create_by_X方法,我可以用2个字段做类似的事情,即如果标签&user_id是唯一的,则创建一个新标签,否则获得标签和用户ID匹配的标签.还有一种类似的处理标签删除的方法吗?
在我的应用程序中,我有一个Widget
模型,一个Feature
带有has_many的模型,通过WidgetFeature
表关联.
根据要求,当我发送WidgetFeature对象时,我也应该将feature_name附加到它,用于相关的给定功能.
有两种方法:
Run Code Online (Sandbox Code Playgroud)widget_feature_object[:feature_name] = feature_name_value
然后我可以在我的控制器或视图中访问它,widget_feature_object[:feature_name]
因为一个对象有(键,值)对,所以我也可以添加另一个.
2.制作feature_name
一个虚拟属性的WidgetFeature
模型,然后创建getter和setter方法吧.
据我所知,当您想要创建与模型中实际存在的字段不同的不同视图时,您应该使用虚拟属性(例如,全名=名字+姓氏).
同样的事情也适合这里吗?
另外,Rails是否对对象进行了一些缓存,在使用虚拟属性时可能会有用,而不是在我使用第一种方法时?
每种方法的优缺点是什么,哪种方法最符合我的要求?非常感谢.
caching ruby-on-rails virtual-attribute ruby-on-rails-3 memorycache
我有带有 ActiveDataProvider 的普通 ModelSearch,我想在 gridview 中添加一个虚拟/相关属性来排序。如果我正在使用 setSort,并且我只添加了这个属性,那么所有其他属性都不再可排序。是否有内置的方法可以向 Sort添加属性?非常感谢!
public function search($params) {
$query = Za::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['defaultOrder' => ['aonr' => SORT_ASC]],
'pagination' => [
'pageSize' => 15,
],
]);
$dataProvider->setSort([
'attributes' => [
'lwnr' => [
'asc' => ['lwnr' => SORT_ASC],
'desc' => ['lwnr' => SORT_DESC],
'label' => 'lwnr',
'default' => SORT_DESC,
],
]
]);
$this->load($params);
...
}
Run Code Online (Sandbox Code Playgroud) accessor ×1
caching ×1
find ×1
gridview ×1
memorycache ×1
php ×1
ruby ×1
sorting ×1
sql ×1
validation ×1
yii ×1
yii-cmodel ×1
yii2 ×1